2013-02-24 93 views
3

我正在創建一個讀取/寫入文本文件的分數系統。我目前的格式讀取文件的每一行,並將每行存儲到List<string>。一條典型的線路就像50:James (50 being the score, James being the username)C#排序包含數字的字符串列表

我需要按分數排序列表,同時保持字符串的名稱。下面是我的意思的例子:

無序文本文件:

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

(請注意有一些分數是一樣的,阻礙了我的使用創建一個使用數字鍵列表)

有序列表:

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

我當前的代碼

(不與兩個或更多的得分相同的工作)
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; 

是的,我知道這是非常低效和醜陋的,但我花了很多時間嘗試了很多不同的方法。

回答

9

您可以使用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

+0

+1,打我吧:) – Bort 2013-02-24 20:04:24

+1

考慮增加所發生的事情的解釋。我非常懷疑OP瞭解這些代碼。 – evanmcdonnal 2013-02-24 20:06:21

+0

它完美無缺地工作,非常感謝!誠然,我不明白,但我會做一些研究! – 2013-02-24 20:11:40

3

可以使用ReadAllLines方法來輕鬆地閱讀文件,然後OrderByDescending排序在你解析的值上的字符串:

string[] sortedScoreLines = 
    File.ReadAllLines(resourcePath + "\\scoreboard.txt") 
    .OrderByDescending(s => Int32.Parse(s.Substring(0, s.IndexOf(':')))) 
    .ThenBy(s => s) 
    .ToArray(); 
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(); 
    } 
1

上Guffa的答案與一些更多的評論

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(); 
相關問題