Ten minste één object moet IComparable implementeren

Dus ik krijg steeds de “

Ten minste één object moet IComparable implementeren.

” wanneer u een tweede speler probeert toe te voegen, werkt de eerste, maar de tweede niet.
Ik MOET ook SortedSetgebruiken, want dat is de vereiste voor het werk, het is schoolwerk.


Antwoord 1, autoriteit 100%

Nou, je probeert SortedSet<>te gebruiken… wat betekent dat je de bestelling belangrijk vindt. Maar zo te zien implementeert uw type PlayerIComparable<Player>niet. Dus welke sorteervolgorde zou je verwachten te zien?

Kortom, je moet je Player-code vertellen hoe je de ene speler met de andere kunt vergelijken. Als alternatief kunt u IComparer<Player>ergens anders implementeren en die vergelijking doorgeven aan de constructor van SortedSet<>om aan te geven in welke volgorde u de spelers wilt hebben. , je zou kunnen hebben:

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

Dan:

// 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());

Antwoord 2, autoriteit 4%

Dit is een meer algemeen antwoord op deze fout denk ik.

Deze regel zal mislukken met de fout die je hebt gekregen:

Items.OrderByDescending(t => t.PointXYZ);

U kunt echter aangeven hoe u het direct wilt vergelijken:

Items.OrderByDescending(t => t.PointXYZ.DistanceTo(SomeOtherPoint))

Dan heb je de IComparable-interface niet nodig.
Hangt af van de API die je gebruikt.
In mijn geval heb ik een Point en een DistanceTo-methode. (Revit-API)
Maar een geheel getal zou nog gemakkelijker moeten zijn om de “grootte/positie” van te bepalen.


Antwoord 3

Je Player-klasse moet de IComparable-interface implementeren..

http://msdn.microsoft.com/en-gb/ library/system.icomparable.aspx


Antwoord 4

Je Player-klasse moet de IComparable-interface implementeren. De SortedSet houdt de items in een gesorteerde volgorde, maar hoe zou hij weten wat de gesorteerde volgorde is als je hem niet hebt verteld hoe ze moeten worden gesorteerd (met behulp van IComparable)?


Antwoord 5

Soms stijgt het wanneer u bent vergeten de eigenschap van de bestelling te schrijven

SortedSet<Player> players = players.OrderBy(c => c);

maar het moet zijn als:

SortedSet<Player> players = players.OrderBy(c => c.PlayerName);

Antwoord 6

Laat uw klasse PlayerIComparableimplementeren.

Other episodes