C#按分数对行进行排序

Posted

技术标签:

【中文标题】C#按分数对行进行排序【英文标题】:C# Sorting lines by score 【发布时间】:2016-02-16 12:32:14 【问题描述】:

我有一个名为 Player 的类,它具有属性 name 和 score,并且在每场比赛之后,它们都使用方法 File.AppendAllText(path, content+Environment.NewLine); 写入文件中。 现在我必须在单击标签“分数”并加载新表单时将它们添加到 listBox..但我想使用我的类 Player,并将项目添加到列表或作为播放器的东西,而不仅仅是从文件中加载它们。 ..我用SortedList 如下图...

    SortedList<int, Player> topList = new SortedList<int, Player>();

    private void Scores_Load(object sender, EventArgs e)
    
        topList.Clear();
        string filename = "highscores.txt";
        using (StreamReader sr = File.OpenText(filename))
        
            string line;
            while ((line = sr.ReadLine()) != null)
            
                string[] s = line.Split(';');
                string name = s[0];
                int score = int.Parse(s[1]);
                Player newPlayer = new Player(name, score);
                if (!topList.ContainsKey(score))
                    topList.Add(score, newPlayer);
            
        

        Output();
    
    private void Output()
    
        lstScores.Items.Clear();
        int rank = 1;
        foreach (int k in topList.Keys.Reverse())
        
            if (rank < 10)//top 9
            
                Player temp = (Player)topList[k];
                lstScores.Items.Add("  " + rank.ToString() + "\t" + temp.ToString());//override of method ToString(), so it returns in format Name+"\t"+Score;
            
            rank++;
        
    

现在这是可以接受的,但这里的问题是我不能有两个相同的键,在这种情况下键是分数...所以我想知道如何修改它以便我可以有两个或更多相同的分数?....也许我应该使用List&lt;&gt;,但我不知道如何按分数对该列表进行排序,因为我在同一行文件中有字符串 + int (name + score)?

【问题讨论】:

【参考方案1】:

你可以使用列表:

List<Player> players = new List<Player>();
players.Add(new Player(name, score));

并按分数排序:

var sorted = players.OrderByDescending(p => p.Score).ToList();

【讨论】:

看起来您将分数存储和排序为字符串。您可以按 int 值排序: var sorted = player.OrderBy(p => Int32.Parse(p.Score)).ToList(); 仍然无法正常工作,但没关系,我只需要第 10 位,所以我添加了 if 语句,将第 10 个玩家插入索引 9,现在它可以工作了!【参考方案2】:

读取您的文件并生成播放器,然后使用 Link OrderBy 运算符:

private IEnumerable<Player> ReadPlayers(TextReader rd)
  string line;
        while ((line = sr.ReadLine()) != null)
        
            string[] s = line.Split(';');
            string name = s[0];
            int score = int.Parse(s[1]);
            yield return new Player(name, score);
        


private void Scores_Load(object sender, EventArgs e)

    string filename = "highscores.txt";
    using (StreamReader sr = File.OpenText(filename)) 
      var sortedPlayers= ReadPlayers(rd)
                             .OrderByDescending(x=x.Score)
                             .Take(10)
                             .Select((p,r)=>$"rank r+1:p.Name : p.Score");
       lstScore.Items.Clear();
       foreach(var p in sortedPlayers) lstScore.Items.Add(p); 
    

【讨论】:

【参考方案3】:

使用 List 代替 SortedList 并使用 OrderBy Linq 方法 (System.Linq):

public class Player

    public string Name  get; set; 
    public int Score  get; set; 


var topList = new List<Player>();
topList = topList.OrderBy(x => x.Score);

【讨论】:

以上是关于C#按分数对行进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 solr 查询中排序之前按分数限制

Meteor - 发布按个性化分数排序的集合

如何在 C# 中按升序对多维数组进行排序? [复制]

Redis 排序集按时间排序并带有分数

存储最后 3 个分数并删除旧分数并计算平均值?

全文搜索按相关性分数排序