At least one object must implement IComparable
Sebastian Wright
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.
7 Answers
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()); 15 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); 1 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.
1You Player class needs to implement the IComparable interface..
0Your 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)?
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 Make your Player class implement IComparable.