2016-02-16 58 views
1

我有一個名爲Player的類,它有屬性名稱和分數,在每個遊戲之後,它們都用方法File.AppendAllText(path, content+Environment.NewLine);寫入文件。 現在我必須將它們添加到列表框中,當標籤「分數」被點擊並且新的窗體被加載時..但是我想使用我的班級玩家,並且將項目添加到列表或者作爲玩家的東西而不是僅僅從文件加載它們...我用SortedList如下圖所示...C#按分數排序行

SortedList<int, Player> topList = new SortedList<int, Player>(); 

    private void Scores_Load(object sender, EventArgs e) 
    { 
     topList.Clear(); 
     string filename = "highscores.txt"; 
     using (StreamReader sr = File.OpenText(filename)) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       string[] s = line.Split(';'); 
       string name = s[0]; 
       int score = int.Parse(s[1]); 
       Player newPlayer = new Player(name, score); 
       if (!topList.ContainsKey(score)) 
        topList.Add(score, newPlayer); 
      } 
     } 

     Output(); 
    } 
    private void Output() 
    { 
     lstScores.Items.Clear(); 
     int rank = 1; 
     foreach (int k in topList.Keys.Reverse()) 
     { 
      if (rank < 10)//top 9 
      { 
       Player temp = (Player)topList[k]; 
       lstScores.Items.Add(" " + rank.ToString() + "\t" + temp.ToString());//override of method ToString(), so it returns in format Name+"\t"+Score; 
      } 
      rank++; 
     } 
    } 

現在,這是可以接受的,但這裏的問題是,我不能有兩個相同的密鑰,在這種情況下,關鍵是分數,所以,我想知道如何修改這個,所以我可以有兩個或更多相同的分數?....也許我應該使用List<>,但我不知道如何按分數排序該列表,因爲我有字符串+ int在同一行文件(名稱+分數)?

回答

3

你可以用列表:

List<Player> players = new List<Player>(); 
players.Add(new Player(name, score)); 

而對於按分數排序:

var sorted = players.OrderByDescending(p => p.Score).ToList(); 
+0

看起來你存儲和排序分數爲字符串。 可以按int值排序: var sorted = players.OrderBy(p => Int32.Parse(p.Score))。ToList(); – danteus

+0

仍然沒有辦法,但從來不知道,我只需要第10名,所以我添加了如果在索引9插入第10個球員的聲明,現在它的工作! –

0

使用列表代替排序列表和使用排序依據 LINQ的方法(System.Linq的):

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

var topList = new List<Player>(); 
topList = topList.OrderBy(x => x.Score); 
1

閱讀您的文件和產量的球員,然後使用鏈接排序依據操作:

private IEnumerable<Player> ReadPlayers(TextReader rd){ 
    string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      string[] s = line.Split(';'); 
      string name = s[0]; 
      int score = int.Parse(s[1]); 
      yield return new Player(name, score); 
     } 
} 

private void Scores_Load(object sender, EventArgs e) 
{ 
    string filename = "highscores.txt"; 
    using (StreamReader sr = File.OpenText(filename)){ 
     var sortedPlayers= ReadPlayers(rd) 
          .OrderByDescending(x=x.Score) 
          .Take(10) 
          .Select((p,r)=>$"rank {r+1}:{p.Name} : {p.Score}"); 
     lstScore.Items.Clear(); 
     foreach(var p in sortedPlayers) lstScore.Items.Add(p); 
    }