我正在添加一个功能来跟踪我制作的小游戏的分数.我想从包含分数的文件中获得前5个分数(包括该分数的名称).
保存分数的格式为:
[名] - [评分]
分数和名称存储在2个列表中,我用这种方式解析:
string scores = File.ReadAllText(Environment.GetEnvironmentVariable("TEMP") + "/scores");
string[] splitscores = scores.Split('\n');
foreach (string entry in splitscores)
{
string replace = entry.Replace("[", "").Replace("]", "");
string[] splitentry = replace.Split('-');
if (splitentry.Count() > 1)
{
scorenames.Add(splitentry[0]);
scorelist.Add(Int32.Parse(splitentry[1]));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法检索#1玩家:
int indexMax
= !scorelist.Any() ? -1 :
scorelist
.Select((value, index) => new { Value = value, Index = index })
.Aggregate((a, b) => (a.Value > b.Value) ? a : b)
.Index;
lblhighscore1.Text = "#1: " + scorelist[indexMax] + " by " + scorenames[indexMax];
Run Code Online (Sandbox Code Playgroud)
如果这是我的得分列表,我如何设置其余4名球员:
[broodplank]-[12240]
[flo]-[10944]
[bill]-[11456]
[tony]-[9900]
[benji]-[7562]
Run Code Online (Sandbox Code Playgroud)
我认为我可以做一个降序的分数列表,但这不会涵盖用户名列表索引的变化,最好的方法是什么?
最好的方法?不要使用并行集合反模式.
而不是拥有2个列表,创建一个可以同时包含名称和分数的类
class Score
{
public string Name { get; private set; }
public int Score { get; private set; }
public Score(string name, int score)
{
Name = name;
Score = score;
}
}
Run Code Online (Sandbox Code Playgroud)
并且只有一个列表
List<Score> scores = new List<Score>();
Run Code Online (Sandbox Code Playgroud)
foreach (string entry in splitscores)
{
string replace = entry.Replace("[", "").Replace("]", "");
string[] splitentry = replace.Split('-');
if (splitentry.Count() > 1)
{
scores.Add(new Score(splitentry[0], Int32.Parse(splitentry[1]))
}
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松地按一个属性进行排序,因为整个对象将被重新排序,您将保留正确顺序的名称,而无需任何其他代码:
topScores = scores.OrderByDescending(x => x.Score).Take(5);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
491 次 |
最近记录: |