我正在创建一个高分top5列表,我不知道如何从文本文件中排序数据并写出具有最高int的top5。现在我有一个程序将结果写入文本文件highscore.txt。
我希望它看起来像这样。
Highscore
1. 500pts
2. 450pts
3. 400pts
4. 350pts
5. 300pts
答案 0 :(得分:0)
File.ReadLines("highscore.txt")
.Select(line => int.Parse(line))
.OrderByDescending(score => score)
.Take(5)
答案 1 :(得分:0)
最佳解决方案取决于您的平台约束和文本文件的大小。
最简单的解决方案可能是将每一行表示为一个类。从文本文件中读取行,填写分数列表,然后
public class Score
{
public int Points { get; set; }
public string Player { get; set; }
}
List<Score> top5 = (from s in allScores select s)
.OrderByDescending(s => s.Points)
.Take(5);
如果您在相对于文本文件大小的内存受限平台上,您可以使用整数计数器来跟踪前5名中当前最低的高分,并使用该计数器来确定您读取的下一个高分应该将文件中的in添加到您手动维护的5个最高分的列表中。
无论哪种方式,您都可以输出前5个:
for (int i = 0; i < top5.Count; i++)
{
Score score top5[i];
// e.g. Console.WriteLine((i + 1) + ". " + top5.Points);
// Optionally output player name / initials if that was in the text file
}
答案 2 :(得分:0)
我建议使用真正的数据库,例如免费的Sql-Server Express。
如果您真的想使用文本文件,可以使用以下方法:
IEnumerable<string> top5HighScore = File.ReadLines("highscore.txt")
.Select(line => int.Parse(line))
.OrderByDescending(score => score)
.Take(5)
.Select((score, index) => string.Format("{0}. {1}pts", index + 1, score));
现在您可以使用foreach
输出字符串。
请注意,您需要添加using System.Linq;
。
答案 3 :(得分:0)
如果数据是直接的,或者您知道文件中的字节偏移量,那么在整个文件中高效读取并以非常便宜的方式跟踪前5个分数是相当容易的。
假设您有一个从文件中返回下一个分数的函数(通过StreamReader),那么代码将看起来像这样(我假设分数是整数):
System.IO.StreamReader reader = new System.IO.StreamReader(fileName); // create StreamReader for the file
int maxTopScores = 5; // maximum number of scores to retrieve
List<int> topScores = new List<int>(); // create a list to store the top scores in
while (!reader.EndOfStream) // check there is still data to read (or some other check, depending on file format)
{
int tempScore = getScore(reader); // hypothetical function that retrieves the next score (returns an int)
for (int i = 0; i < topScores.Count; i++)
{
if (tempScore > topScores[i])
{
topScores.Insert(i, tempScore); // insert this score before the one that it is bigger than
if (topScores.Count > maxTopScores)
topScores.RemoveAt(topScores.Count - 1); // too many scores, remove the last (lowest)
goto scoreAdded; // sorry about the goto, but I hate breaking through loops with state booleans
}
}
// score not added yet
if (topScores.Count < maxTopScores)
topScores.Add(tempScore); // not enough scores, add it to the end (it's the lowest yet)
scoreAdded:
continue; // annoyingly this is needed
}
此应该为您提供List的int分数,其中最高分为topScores
中的索引0,并且当您向下移动时分数较低。它不需要太多内存,你将很难崩溃它。
如果需要,只需在fileName
处将分数插入到列表中,然后确保该列表的分数不超过maxTopScores
。