【问题标题】:C# Sorting lines by scoreC#按分数对行进行排序
【发布时间】:2026-02-14 03:50:01
【问题描述】:

我有一个名为 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)?

【问题讨论】:

    标签: c# winforms


    【解决方案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);
      

      【讨论】: