2013-01-03 11 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"); 
       } 
      } 
     } 
    } 
} 

Więc zachować uzyskiwanie „Przynajmniej jeden obiekt musi zaimplementować IComparable

At least one object must implement IComparable.

” podczas próby dodania drugiego gracza, pierwsza z nich działa, ale drugi nie. Muszę również używać SortedSet, ponieważ jest to wymagane do pracy, to praca w szkole.

+6

Błąd mówi dokładnie o tym, co powinieneś wiedzieć - Klasa 'Player' musi implementować interfejs" IComparable " –

+1

Ten rodzaj błędu nie powinien istnieć, mamy niezawodny język z nielicznych powodów,' SortedSet 'powinien naprawdę mieć ograniczenie' T: IComparable ' – Lukazoid

Odpowiedz

48

Cóż, starasz się używać SortedSet<> ... co oznacza, że ​​dbają o zamówieniu. Ale przy dźwiękach tego twój typ Player nie implementuje IComparable<Player>. Jaką więc kolejność sortowania można się spodziewać?

Zasadniczo, musisz podać swój kod Player, jak porównać jednego gracza z drugim. Alternatywnie, można wdrożyć IComparer<Player> gdzieś indziej, i przekazać te porównania do konstruktora SortedSet<> wskazania jakiej kolejności chcesz graczy w Na przykład, można mieć:.

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); 
    } 
} 

Następnie:

// 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, ponieważ jest to jedyna odpowiedź, która faktycznie wyjaśnia OP ** dlaczego ** musi wdrożyć IComparable – ken2k

+0

yupp dzięki, próbuję tego, ale próbuję porównać wyniki każdego z graczy, próbując to zorganizować aby najwyższy wynik był pierwszy i tak. Ale im się ten błąd: błąd Niekonsekwetne dostępność: Typ parametru 'ConsoleApplication1.Player' jest mniej dostępny niż metoda „ConsoleApplication1.Comp.Compare (ConsoleApplication1.Player, ConsoleApplication1.Player) – user1930824

+0

@ user1930824: Tak, więc trzeba uczynić z niego klasę wewnętrzną, a nie publiczną. Następnie porównaj wyniki, a nie nazwiska. (Nie zamierzam podawać ci łyżki * dokładnego * kodu, którego potrzebujesz ...) –

1

Wykonaj swoją klasę Player implementuj IComparable.

+0

pokazać swoją pracę dla ludzi, aby dokładnie zrozumieć. – Jogi

0

Twoja klasa Player musi implementować interfejs IComparable. SortedSet przechowuje elementy w posortowanej kolejności, ale skąd miałaby wiedzieć, jaka jest posortowana kolejność, jeśli nie powiedziałeś jej, jak je sortować (używając IComparable)?

Powiązane problemy