user1930824
user1930824

Reputation: 715

At least one object must implement IComparable

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

Answers (7)

Ali Borjian
Ali Borjian

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

Sohil Mansuri
Sohil Mansuri

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

user12062394
user12062394

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

Jon Skeet
Jon Skeet

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

CorrugatedAir
CorrugatedAir

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

WraithNath
WraithNath

Reputation: 18013

You Player class needs to implement the IComparable interface..

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

Upvotes: 1

Philip Kendall
Philip Kendall

Reputation: 4314

Make your Player class implement IComparable.

Upvotes: 0

Related Questions