2013-01-03 181 views
22
using System; 
using System.Xml; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SortedSet<Player> PlayerList = new SortedSet<Player>(); 

      while (true) 
      { 
       string Input; 
       Console.WriteLine("What would you like to do?"); 
       Console.WriteLine("1. Create new player and score."); 
       Console.WriteLine("2. Display Highscores."); 
       Console.WriteLine("3. Write out to XML file."); 
       Console.Write("Input Number: "); 
       Input = Console.ReadLine(); 
       if (Input == "1") 
       { 
        Player player = new Player(); 
        string PlayerName; 
        string Score; 

        Console.WriteLine(); 
        Console.WriteLine("-=CREATE NEW PLAYER=-"); 
        Console.Write("Player name: "); 
        PlayerName = Console.ReadLine(); 
        Console.Write("Player score: "); 
        Score = Console.ReadLine(); 

        player.Name = PlayerName; 
        player.Score = Convert.ToInt32(Score); 

        //==================================== 
        //ERROR OCCURS HERE 
        //==================================== 
        PlayerList.Add(player); 


        Console.WriteLine("Player \"" + player.Name + "\" with the score of \"" + player.Score + "\" has been created successfully!"); 
        Console.WriteLine(); 
       } 
       else 
       { 
        Console.WriteLine("INVALID INPUT"); 
       } 
      } 
     } 
    } 
} 

所以,我不斷收到「至少一個對象必須實現IComparable

At least one object must implement IComparable.

」嘗試添加第二個球員的時候,第一個作品,但第二個沒有。 我也必須使用SortedSet,因爲這是工作的要求,這是學校的工作。

+6

錯誤告訴你到底需要知道什麼 - 你的Player類必須實現'IComparable'接口 –

+1

這種錯誤不應該存在,我們有一個很好的類型安全語言,'SortedSet '應該真的有'T:IComparable ' – Lukazoid

回答

48

嗯,你正在嘗試使用SortedSet<> ......這意味着你關心的排序。但通過它的聲音,你的Player類型不執行IComparable<Player>。那麼你希望看到什麼排序?

基本上,你需要告訴你的Player代碼如何比較一個球員與另一個球員。或者,你可以實現IComparer<Player>其他地方,並傳遞比較成SortedSet<>構造函數來表示你想要什麼樣的順序在球員例如,你可以有:

public class PlayerNameComparer : IComparer<Player> 
{ 
    public int Compare(Player x, Player y) 
    { 
     // TODO: Handle x or y being null, or them not having names 
     return x.Name.CompareTo(y.Name); 
    } 
} 

然後:

// Note name change to follow conventions, and also to remove the 
// implication that it's a list when it's actually a set... 
SortedSet<Player> players = new SortedSet<Player>(new PlayerNameComparer()); 
+11

+1,因爲這是唯一的答案,實際上解釋OP **爲什麼**他需要實現IComparable – ken2k

+0

yupp謝謝,即時嘗試這個,但是,即時試圖比較每個球員的分數,試圖安排它所以最高的分數首先等。 但是我得到這個錯誤: 錯誤不一致的可訪問性:參數類型'ConsoleApplication1.Player'比方法'ConsoleApplication1.Comp.Compare(ConsoleApplication1.Player,ConsoleApplication1.Player)更難以訪問 – user1930824

+0

@ user1930824:對,所以你需要把它變成一個內部的班級而不是公共的班級。然後比較分數而不是名字。 (我不打算把你需要的*確切的*代碼給你)# –

1

讓你的Player類執行IComparable

+0

的限制顯示你的工作讓人們徹底瞭解。 – Jogi

0

您的Player類必須實現IComparable接口。 SortedSet按排序順序保存項目,但如果您沒有告訴它如何對它們進行排序(使用IComparable),它將如何知道排序順序是什麼?

相關問題