2015-09-06 44 views
3

我添加了一个函数来跟踪我制作的小游戏的分数。 我想从包含分数的文件中获得前5个分数(包括该分数的名称)。从列表中获得排名前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])); 
    } 
} 

然后,我通过检索#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]; 

如何设置剩余的4名选手假设这是我的得分列表:

[broodplank]-[12240] 
[flo]-[10944] 
[bill]-[11456] 
[tony]-[9900] 
[benji]-[7562] 

我想我可以做一个降序排序比分名单,但将不包括在该指标的变化用户名列表中,最好的方法是什么?

+0

而不是'ReadAllText' /'.Split',你可以只用'ReadAllLines'开始。 – crashmstr

回答

9

最好的办法是?不要使用parallel collections anti-pattern

而不必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; 
    } 
} 

,并只有一个列表类

List<Score> scores = new List<Score>(); 
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])) 
    } 
} 

你可以很容易地通过一个属性进行排序,因为整个对象将被重新排序,您将保留t中的名称他正确的顺序没有任何额外的代码:

topScores = scores.OrderByDescending(x => x.Score).Take(5); 
+0

非常感谢! – broodplank

0

除了MarcinJuraszeks有用的答案,有的说我碰到用他的解决方案,我决定分享来到小东西。

第一个问题是与扔我下面的错误

“分数”类:成员名称不能与它们的封闭类型

更改的“S”的情况下,固定它

class Score 
{ 
    public string Name { get; private set; } 
    public int score { get; private set; } 

    public Score(string name, int Score) 
    { 
     Name = name; 
     score = Score; 
    } 
} 

并调用单独的值可以使用LINQ

完成
string numberOne = topScores.Skip(0).First().score 
string numberTwo = topScores.Skip(1).First().score