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

所以我不断得到“

至少一个对象必须实现 IComparable。

“当尝试添加第二个玩家时,第一个有效,但第二个无效。我也必须使用SortedSet,因为这是工作的要求,它是学校作业。

4

6 回答 6

92

好吧,您正在尝试使用SortedSet<>... 这意味着您关心排序。但是听上去你的Player类型没有实现IComparable<Player>. 那么您希望看到什么样的排序顺序?

基本上,您需要告诉您的Player代码如何将一个玩家与另一个玩家进行比较。或者,您可以在IComparer<Player>其他地方实现,并将该比较传递给构造函数SortedSet<>以指示您希望玩家的顺序。例如,您可以:

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

然后:

// 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());
于 2013-01-03T15:29:13.320 回答
4

我想这是对这个错误的更一般的答案。

此行将因您收到的错误而失败:

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

但是,您可以指定如何直接比较它:

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

然后你不需要 IComparable 接口。取决于您使用的 API。就我而言,我有一个 Point 和 DistanceTo 方法。(Revit API) 但是整数应该更容易确定“大小/位置”。

于 2019-09-13T09:28:44.173 回答
1

你的 Player 类需要实现 IComparable 接口..

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

于 2013-01-03T15:28:32.270 回答
0

您的 Player 类必须实现 IComparable 接口。SortedSet 以排序顺序保存项目,但是如果您没有告诉它如何对它们进行排序(使用 IComparable),它怎么知道排序顺序是什么?

于 2013-01-03T15:30:44.743 回答
0

有时它会在您忘记编写 order 属性时引发

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

但它必须是这样的:

SortedSet<Player> players = players.OrderBy(c => c.PlayerName);
于 2022-01-18T15:32:43.650 回答
-1

让你的Player班级实现IComparable.

于 2013-01-03T15:28:19.130 回答