在类中,我有一个制作游戏的任务,我必须使用.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])));
}
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();
}