按最高分对文件进行排序.txt不起作用



在类中,我有一个制作游戏的任务,我必须使用.txt文件和.txt文件制作排行榜/高分列表。

我的文件是这样的

name 1, 6
name 2, 3
name 3, 9

以及我希望它看起来像什么

name 3, 9
name 1, 6
name 2, 3

我可以显示文本文件。我正在使用列表框,但在显示之前无法对其进行排序。

这是代码片段

 private void Leaderboard_Load(object sender, EventArgs e)
    {
        string[] scores = File.ReadAllLines(filepath); //filepath is equal to @database.txt file
        var orderedScores = scores.OrderBy(x => int.Parse(x.Split(',')[1]));
        foreach (var entry in orderedScores)
        {
            Console.WriteLine(scores);
        }
        StreamReader sr = new StreamReader(@"database.txt");
        while (line != null)
        {
            line = sr.ReadLine();
            if (line != null)
            {
                scoreboard.Items.Add(line);
            }
        }
        sr.Close();
    }

我尝试修改代码并使用不同的符号来拆分单词 (; ? $( 而不是 ,但它没有奏效。运行时没有错误,只是不对文件进行排序。我错过了什么吗?

您实际上并没有对文件进行排序。

var orderedScores = scores.OrderBy(x => int.Parse(x.Split(',')[1]));

将从文件中读取的行排序到一个新的集合中,然后继续打印出来。

StreamReader sr = new StreamReader(@"database.txt");

这是您获取记分牌来源的地方,问题是它从同一文件中读取,并且您从未写回排序的行。

如果需要将排序列表写回文件,则需要执行以下操作:

var fileText = String.Join(System.Environment.NewLine, orderedScores);
File.WriteAllText(filepath, orderedScores);

但是,您不必将其写回文件。如果您只想显示排序列表,而不是将其写回文件,您所要做的就是循环访问 orderedScores;喜欢这个:

private void Leaderboard_Load(object sender, EventArgs e)
    {
        string[] scores = File.ReadAllLines(filepath); //filepath is equal to @database.txt file
        var orderedScores = scores.OrderBy(x => int.Parse(x.Split(',')[1]));
        foreach (var entry in orderedScores)
        {
            Console.WriteLine(entry);
            if (entry != null)
            {
                scoreboard.Items.Add(entry);
            }
        }
    }

从技术上讲,由于ListBox支持AddRange,您所要做的就是:

private void Leaderboard_Load(object sender, EventArgs e)
    {    
        string[] scores = File.ReadAllLines(filepath); 
        scoreboard.Items.AddRange(scores.OrderBy(x => int.Parse(x.Split(',')[1])));
    }

正如下面@PaulF提到的,您每次迭代都会通过有序分数写出无序列表,您应该将列表打印 3 次,无序(这使得您的代码看起来好像什么都不做,即使它实际上是对列表进行排序(

您可以通过将Console.WriteLine(scores)替换为Console.WriteLine(entry)来解决此问题

最后,这仍然不会给你你想要的结果,因为这会对文件或ListBox进行排序,但它会升序排序,你需要降序排序:

private void Leaderboard_Load(object sender, EventArgs e)
    {    
        string[] scores = File.ReadAllLines(filepath); 
        scoreboard.Items.AddRange(scores.OrderByDescending(x => int.Parse(x.Split(',')[1])));
    }

您需要使用 OrderByDescending 方法。

private void Leaderboard_Load(object sender, EventArgs e)
    {
        string[] scores = File.ReadAllLines(filepath); //filepath is equal to @database.txt file
        var orderedScores = scores.OrderByDescending(x => int.Parse(x.Split(',')[1]));
        foreach (var entry in orderedScores)
        {
            Console.WriteLine(entry);
        }
        StreamReader sr = new StreamReader(@"database.txt");
        while (line != null)
        {
            line = sr.ReadLine();
            if (line != null)
            {
                scoreboard.Items.Add(line);
            }
        }
        sr.Close();
    }

最新更新