Reputation: 715
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");
}
}
}
}
}
So i keep getting the "
At least one object must implement IComparable.
" when trying to add a second player, the first one works, but the second one doesn't.
I also MUST use SortedSet
because that is the requirement for the work, it's school work.
Upvotes: 70
Views: 140186
Reputation: 1108
Sometime it raises when you forget the order property
SortedSet<Player> players = players.OrderBy(c => c);
but it must be like :
SortedSet<Player> players = players.OrderBy(c => c.PlayerName);
Upvotes: 19
Reputation: 11
it mostly occur if you forgot to write property, instead you used object
for example
options.OrderBy(o => o.Rate.Value) --- Correct
options.OrderBy(o => o.Rate) ---- wrong
Upvotes: 1
Reputation: 79
This is a more general answer to this error i suppose.
This line will fail with the error you got:
Items.OrderByDescending(t => t.PointXYZ);
However you can specify how to compare it directly:
Items.OrderByDescending(t => t.PointXYZ.DistanceTo(SomeOtherPoint))
Then you dont need the IComparable interface. Depends on the API you are using. In my case i have a Point and a DistanceTo-method. (Revit API) But an integer should be even easier to determine the "size/position" of.
Upvotes: 6
Reputation: 1499790
Well, you're trying to use SortedSet<>
... which means you care about the ordering. But by the sounds of it your Player
type doesn't implement IComparable<Player>
. So what sort order would you expect to see?
Basically, you need to tell your Player
code how to compare one player with another. Alternatively, you could implement IComparer<Player>
somewhere else, and pass that comparison into the constructor of SortedSet<>
to indicate what order you want the players in. For example, you could have:
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);
}
}
Then:
// 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());
Upvotes: 112
Reputation: 819
Your Player class must implement the IComparable interface. The SortedSet holds the items in a sorted order, but how would it know what the sorted order is if you haven't told it how to sort them (using IComparable)?
Upvotes: 0
Reputation: 18013
You Player class needs to implement the IComparable interface..
http://msdn.microsoft.com/en-gb/library/system.icomparable.aspx
Upvotes: 1