从列表中获得前5个得分/名称

时间:2015-09-06 01:20:56

标签: c# sorting

我正在添加一个功能来跟踪我制作的小游戏的分数。 我想从包含分数的文件中获得前5个分数(包括该分数的名称)。

已保存分数的格式为:

  

[NAME] - [得分]

分数和名称存储在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]

我认为我可以对分数列表进行降序排列,但这不会涵盖用户名列表索引的变化,最好的方法是什么?

2 个答案:

答案 0 :(得分: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]))
    }
}

您可以轻松地按一个属性进行排序,因为整个对象将被重新排序,您将保留正确顺序的名称,而无需任何其他代码:

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

答案 1 :(得分:0)

除了MarcinJuraszeks有用的答案之外,还有一些我用他的解决方案遇到的小事我决定分享。

第一个问题是该课程给我带来了以下错误

  

&#39;分数&#39;:成员名称不能与其封闭类型相同

改变&#34; s&#34;修好了

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 

等等