6

テキスト ファイルの読み取り/書き込みを行うスコア システムを作成しています。私の現在の形式は、ファイルの各行を読み取り、各行をList<string>. 典型的な行は次のようになります50:James (50 being the score, James being the username)

文字列で名前を保持しながら、スコアでリストを並べ替える必要があります。これが私が意味することの例です:

順序付けられていないテキスト ファイル:

50:James
23:Jessica
70:Ricky
70:Dodger
50:Eric

(同じスコアがいくつかあることに注意してください。これは、数値キーを使用してリストを作成する私の使用を妨げています)

順序付きリスト:

70:Dodger
70:Ricky
50:Eric
50:James
23:Jessica

現在のコード (2 つ以上の同じスコアでは機能しません)

Dictionary<int, string> scoreLines = new Dictionary<int, string>();

if (!File.Exists(scorePath))
{
    File.WriteAllText(scorePath, "No Scores", System.Text.Encoding.ASCII);
}

StreamReader streamReader = new StreamReader(resourcePath + "\\scoreboard.txt");

int failedLines = 0;

while (failedLines < 3)
{
    string line = streamReader.ReadLine();

    if (String.IsNullOrEmpty(line))
    {
        failedLines++;
        continue;
    }

    scoreLines.Add(int.Parse(line.Split(':')[0]), line.Split(':')[1]);
}

var arr = scoreLines.Keys.ToArray();
arr = (from a in arr orderby a descending select a).ToArray();

List<string> sortedScoreLines = new List<string>();

foreach (int keyNum in arr)
{
    sortedScoreLines.Add(keyNum + ":" + scoreLines[keyNum]);
}

return sortedScoreLines;

はい、私はこれが非常に非効率的で醜いことを知っていますが、私は非常に多くの異なる方法を試すのに何年も費やしました.

4

5 に答える 5

19

使用できますString.Split

var ordered = list.Select(s => new { Str = s, Split = s.Split(':') })
            .OrderByDescending(x => int.Parse(x.Split[0]))
            .ThenBy(x => x.Split[1])
            .Select(x => x.Str)
            .ToList();

編集: Ideone のデータを使用したデモは次のとおりです: http://ideone.com/gtRYO7

于 2013-02-24T20:03:33.383 に答える
3

メソッドを使用しReadAllLinesてファイルを簡単に読み取り、OrderByDescending解析した値で文字列を並べ替えることができます。

string[] sortedScoreLines =
  File.ReadAllLines(resourcePath + "\\scoreboard.txt")
  .OrderByDescending(s => Int32.Parse(s.Substring(0, s.IndexOf(':'))))
  .ThenBy(s => s)
  .ToArray();
于 2013-02-24T20:04:44.813 に答える
1

グッファの回答に基づいて、いくつかのコメントを追加

string[] sortedScoreLines =
            File.ReadAllLines(resourcePath + "\\scoreboard.txt");

        // parse into an anonymous class
        var parsedPersons = from s in sortedScoreLines
                            select new
                                       {
                                           Score = int.Parse(s.Split(':')[0]),
                                           Name = s.Split(':')[1]
                                       };

        // sort the list
        var sortedPersons = parsedPersons.OrderByDescending(o => o.Score).ThenBy(i => i.Name);

        // rebuild the resulting array
        var result = (from s in sortedPersons
                     select s.Score + ":" + s.Name).ToArray();
于 2013-02-24T20:18:57.877 に答える
0

これをチェックして:

var sortedScoreLines = GetLines("inputFilePath")
        .Select(p => new { num = int.Parse(p.Split(':')[0]), name = p.Split(':')[1] })
        .OrderBy(p => p.num)
        .ThenBy(p => p.name)
        .Select(p => string.Format("{0}:{1}", p.num, p.name))
        .ToList();

    private static List<string> GetLines(string inputFile)
    {
        string filePath = Path.Combine(Directory.GetCurrentDirectory(), inputFile);
        return File.ReadLines(filePath).ToList();
    }
于 2013-02-24T20:11:07.933 に答える