从文本文件中读取并对行进行排序(每行 int + 字符串)



我正在为一个类似于地铁冲浪者的大学项目编写游戏。我让一切正常工作,但我的问题出现在我编码的书签选项中。

当您在游戏中输掉时,您必须输入一个名称,该名称将以<int score> <string name>格式写入并保存在文本文件中,例如:

11245 Lucas
10123 Marco
2394 Ricky

因此,在游戏菜单中,您可以选择书签,然后读取文本文件并将其显示在屏幕上,一个分数在另一个分数下,每个游戏中都写着名称。

现在我的问题是我希望对书签进行排序,最高在顶部,但我不知道我该怎么做,因为我每行都有一个 int 和一个字符串,它们是相关的,因此我不能有一个文件用于分数和一个文件用于名称,因此当我对分数进行排序时,我丢失了有关谁获得了每个分数的信息。

我能做些什么来解决这个问题?

编辑: 我正在添加与我的问题相关的代码部分。 这是显示书签的方法

static void ReadBookmark()
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("BOOKMARKS");
string myfile = @"bookmarks.txt";
if (File.Exists(myfile) == false)
{
Console.WriteLine("n");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("NO BOOKMARKS. PLAY SOME GAMES!");
Console.Write("nPRESS A KEY TO RETURN...");
Console.ReadKey();
}
else
{
Console.WriteLine("n");
Console.ForegroundColor = ConsoleColor.Green;
using (StreamReader sr = File.OpenText(myfile))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Console.WriteLine($"t{s}");
}
}
Console.ForegroundColor = ConsoleColor.White;
Console.Write("nnPRESS A KEY TO RETURN...");
Console.ReadKey();
}
}

这是将名称和分数写在文件上的代码。

public void SaveBookmark(int score, string name)
{
string myfile = @"bookmarks.txt";
using (StreamWriter sw = File.AppendText(myfile))
{
sw.WriteLine($"{score} {name}");
}
}

您可以在空格上拆分每一行,然后使用int.Parse获取第一部分的数值,然后使用该值OrderByDescending

var orderedLines = File.ReadLines(myfile)
.OrderByDescending(line => int.Parse(line.Split()[0]))
.ToList();

如何安全执行的完整示例,在发布代码之前完成。 这将允许名称中有一个空格。

public List<ScoreItem> GetScores()
{
var scoreList = new List<ScoreItem>();
using (var fs = File.OpenRead("myPath"))
using (var sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
if (string.IsNullOrWhiteSpace(line)) continue;
var scoreMatch = Regex.Match(line, @"Ad*");
if (!scoreMatch.Success)
throw new Exception($"Failed to parse score from line [{line}].");
var nameMatch = Regex.Match(line, @"(?<!Ad*).*Z");
if (!nameMatch.Success)
throw new Exception($"Failed to parse name from line [{line}].");
if (!int.TryParse(scoreMatch.Value, out var score))
throw new Exception($"Failed to cast score to a number from line [{line}].");
scoreList.Add(new ScoreItem {Name = nameMatch.Value, Score = score});
}
return scoreList.OrderByDescending(s => s.Score).ToList();
}
}
public class ScoreItem
{
public string Name { get; set; }
public int Score { get; set; }
}

最新更新