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
,因为这是工作的要求,这是学校的工作。
答案 0 :(得分:63)
嗯,你正在尝试使用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());
答案 1 :(得分:4)
You Player类需要实现IComparable接口..
http://msdn.microsoft.com/en-gb/library/system.icomparable.aspx
答案 2 :(得分:2)
制作Player
班级工具IComparable
。
答案 3 :(得分:1)
您的Player类必须实现IComparable接口。 SortedSet按排序顺序保存项目,但如果您没有告诉它如何对它们进行排序(使用IComparable),它将如何知道排序顺序是什么?
答案 4 :(得分:0)
这是对此错误的更一般的回答。
此行将因您得到的错误而失败: “ Items.OrderByDescending(t => t.PointXYZ);”
但是,您可以指定如何直接进行比较: “ Items.OrderByDescending(t => t.PointXYZ.DistanceTo(SomeOtherPoint))”
然后,您不需要IComparable接口。 取决于您使用的API。 就我而言,我有一个Point和DistanceTo方法。 (Revit API) 但是,整数应该更容易确定其“大小/位置”。