在列表框中排序项目时遇到问题

时间:2017-11-14 19:46:21

标签: c# visual-studio sorting

我正在使用StreamReader从文本文件中读取游戏的高分列表。然后我使用.Sort()

对其进行排序

我将它转换为数组并将其传递到游戏中表单上的列表框中。 分数以字符串(分数+“ - ”+用户名)

保存到文本文件中
public frmHighScores()
    {
        InitializeComponent();

        List<string> scores = new List<string>();
        StreamReader inputFile = File.OpenText("High Scores.txt");
        while (!inputFile.EndOfStream)
        {
            scores.Add(inputFile.ReadLine());
        }
        scores.Sort();
        lstScores.Items.AddRange(scores.ToArray());
    }

因为它是一个字符串,所以Sort方法只对得分中的第一个数字进行排序,我不知道如何纠正它。

Here is the image of the sorted list

我希望它如下所示

200
120
105
65

2 个答案:

答案 0 :(得分:2)

您可以使用词典来存储这些值(分数和用户名)。这将使您能够使用真实的数字类型进行订购。您可以通过拆分字符串来构建此字典,如下所示:

public void frmHighScores()
    {
        // Pretend we read this from the file
        List<string> fakeFileValues = new List<string>() { "20 steve", "100 john", "25 jane" };
        Dictionary<int, string> scores = new Dictionary<int, string>();

        foreach (string s in fakeFileValues)
        {
            // Better ways to do this, just expanding for clarity
            string[] split = s.Split(' ');
            scores.Add(int.Parse(split[0]), split[1]);
        }

        // You can then order by a real numeric value
        scores.OrderBy(x => x.Key);
    }

答案 1 :(得分:1)

您可以使用LINQ OrderByDescending扩展方法并传递“ - ”符号之前的值,如下所示:

scores = scores.OrderByDescending(x=>Convert.ToInt32(x.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0]).Trim());