winforms 如何将txt文件的内容追加到数组中,但txt文件具有不同的变量类型

vjhs03f7  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(161)

自从我们今年开始学习基础知识以来,我对编码和所有这些都不是很在行,我的小组成员也没有做任何事情来帮助我,所以我在这里迷路了,想向这里所有的Maven寻求帮助。
我想知道如何正确地对文本框中的混合数据进行排序(我正在使用控制台应用程序访问窗口和表单,因为这是我们的教授希望我们做的)。如下图所示,它按字母顺序排列,而不是按分数降序排列,球员的名字在他们的分数旁边。

void show_Click(object sender, EventArgs e)
        {
            int counter = 0;

            string line;

            StreamReader TXT = new StreamReader("Leaderboard.txt");
            List<string> list = new List<string>();
            while ((line = TXT.ReadLine()) != null)
            {
                ListB1.Items.Add(line);
                list.Add(line);
                counter++;
            }
            string[] arr = list.ToArray();
            Array.Sort(arr);
            Array.Reverse(arr);
            foreach (string item in arr)
            {
                ListB2.Items.Add(item);
            }

这仅仅是我整个代码的一小部分,但我认为这是使我的排行榜正常工作最重要的部分。
this is what my code results to, as of now...

ac1kyiln

ac1kyiln1#

现在你把文件的每一行都当作一个字符串来读,所以“score”和“text”没有区别,都是一个文本值。
听起来你 * 想要 * 的是把信息解析成一个具有两个不同属性的对象。

public class ScoreListing
{
    public int Score { get; set; }
    public string Text { get; set; }
}

那么你的清单应该是这样的:

List<ScoreListing> list = new List<ScoreListing>();

要添加到它,你需要解析来自line的信息,创建一个新的ScoreListing对象。

while ((line = TXT.ReadLine()) != null)
{
    var elements = line.Split(' | ');
    var listing = new ScoreListing
    {
        Score = int.Parse(elements[0]),
        Text = elements[1]
    };
    list.Add(listing);
    counter++;
}

填充了List<ScoreListing>后,可以使用.OrderBy()对其进行排序,例如:

var sortedLeaderboard = list.OrderByDescending(l => l.Score);

有多种方法来存储数据,对数据进行排序等等。但是总的来说,当你有一个像"123 | SomeText"这样的值时,你 * 真正 * 拥有的是一个具有两个不同属性的自定义序列化对象。当你将这些数据读入内存时,你的第一个目标应该是将它反序列化为那个有意义的对象。然后你就可以很容易地用你喜欢的方式使用那个对象了。
应要求,关于将数据 * 转换回 * 字符串的更多信息...
最面向对象的方法是在类上重写.ToString()

public class ScoreListing
{
    public int Score { get; set; }
    public string Text { get; set; }

    public override string ToString()
    {
        return $"{Score} | {Text}";
    }
}

然后可以将其添加到字符串列表中:

foreach (var item in sortedLeaderboard)
{
    ListB2.Items.Add(item.ToString());
}

在不覆盖.ToString()的情况下,您只需手动执行相同的操作:

foreach (var item in sortedLeaderboard)
{
    ListB2.Items.Add($"{item.Score} | {item.Text}");
}

相关问题