2015-09-06 46 views
3

我添加了一個函數來跟蹤我製作的小遊戲的分數。 我想從包含分數的文件中獲得前5個分數(包括該分數的名稱)。從列表中獲得排名前5的分數

保存的分數的格式爲:

[名] - [評分]

的得分和名稱都存儲在2只列出,這是我分析是這樣的:

string scores = File.ReadAllText(Environment.GetEnvironmentVariable("TEMP") + "/scores"); 
string[] splitscores = scores.Split('\n'); 

foreach (string entry in splitscores) 
{ 
    string replace = entry.Replace("[", "").Replace("]", ""); 
    string[] splitentry = replace.Split('-'); 

    if (splitentry.Count() > 1) 
    { 
     scorenames.Add(splitentry[0]); 
     scorelist.Add(Int32.Parse(splitentry[1])); 
    } 
} 

然後,我通過檢索#1播放器:

int indexMax 
    = !scorelist.Any() ? -1 : 
    scorelist 
    .Select((value, index) => new { Value = value, Index = index }) 
    .Aggregate((a, b) => (a.Value > b.Value) ? a : b) 
    .Index; 

lblhighscore1.Text = "#1: " + scorelist[indexMax] + " by " + scorenames[indexMax]; 

如何設置剩餘的4名選手假設這是我的得分列表:

[broodplank]-[12240] 
[flo]-[10944] 
[bill]-[11456] 
[tony]-[9900] 
[benji]-[7562] 

我想我可以做一個降序排序比分名單,但將不包括在該指標的變化用戶名列表中,最好的方法是什麼?

+0

而不是'ReadAllText' /'.Split',你可以只用'ReadAllLines'開始。 – crashmstr

回答

9

最好的辦法是?不要使用parallel collections anti-pattern

而不必2所列出的,創建一個能容納的名稱和分數一起

class Score 
{ 
    public string Name { get; private set; } 
    public int Score { get; private set; } 

    public Score(string name, int score) 
    { 
     Name = name; 
     Score = score; 
    } 
} 

,並只有一個列表類

List<Score> scores = new List<Score>(); 
foreach (string entry in splitscores) 
{ 
    string replace = entry.Replace("[", "").Replace("]", ""); 
    string[] splitentry = replace.Split('-'); 

    if (splitentry.Count() > 1) 
    { 
     scores.Add(new Score(splitentry[0], Int32.Parse(splitentry[1])) 
    } 
} 

你可以很容易地通過一個屬性進行排序,因爲整個對象將被重新排序,您將保留t中的名稱他正確的順序沒有任何額外的代碼:

topScores = scores.OrderByDescending(x => x.Score).Take(5); 
+0

非常感謝! – broodplank

0

除了MarcinJuraszeks有用的答案,有的說我碰到用他的解決方案,我決定分享來到小東西。

第一個問題是與扔我下面的錯誤

「分數」類:成員名稱不能與它們的封閉類型

更改的「S」的情況下,固定它

class Score 
{ 
    public string Name { get; private set; } 
    public int score { get; private set; } 

    public Score(string name, int Score) 
    { 
     Name = name; 
     score = Score; 
    } 
} 

並調用單獨的值可以使用LINQ

完成
string numberOne = topScores.Skip(0).First().score 
string numberTwo = topScores.Skip(1).First().score