从文本文件中读取结果并写入top5,编号最大

时间:2012-12-17 16:28:25

标签: c# text-files

我正在创建一个高分top5列表,我不知道如何从文本文件中排序数据并写出具有最高int的top5。现在我有一个程序将结果写入文本文件highscore.txt。

我希望它看起来像这样。

Highscore
1. 500pts
2. 450pts
3. 400pts
4. 350pts
5. 300pts

4 个答案:

答案 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