我为我的C#类编写了一个程序,需要弄清楚如何实现IComparable以便能够对自定义类型的数组进行排序。它编译时没有错误,但在运行时抛出异常:
System.InvalidOperationException:无法比较数组中的两个元素。 ---> System.ArgumentException:至少有一个对象必须实现IComparable。
我已经搜索了几个小时才找到无效的解决方案。关于这个问题有很多信息,但我可能只是在思考它。我将发布该计划,如果有人能指出我正确的方向并给出解释,我将永远感激,因为截止日期即将来临。
附:这是我第一次在这里发帖,所以在批评我的缺点时要温柔一点。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HighScores4
{
class Program
{
static void Main(string[] args)
{
string playerInitials;
int playerScore;
const int NUM_PLAYERS = 10;
Player[] stats = new Player[NUM_PLAYERS];
for (int index = 0; index < NUM_PLAYERS; index++)
{
Console.WriteLine("Please enter your initials: ");
playerInitials = Convert.ToString(Console.ReadLine());
Console.WriteLine("Please enter your score: ");
playerScore = Convert.ToInt32(Console.ReadLine());
stats[index] = new Player(playerScore, playerInitials);
}
Array.Sort(stats); **// Exception thrown here**
Array.Reverse(stats);
for (int index = 0; index < NUM_PLAYERS; index++)
{
Console.WriteLine(stats[index].ToString());
}
#if DEBUG
Console.ReadKey();
#endif
}
}
public class Player
{
public string Initials { get; set; }
public int Score { get; set; }
public Player(int score, string initials)
{
Initials = initials;
Score = Score;
}
public override string ToString()
{
return string.Format("{0, 3}, {1, 7}", Score, Initials);
}
}
}
答案 0 :(得分:3)
异常信息非常清楚。
must implement IComparable
这意味着您必须为IComparable
课程实施Player
。
public class Player : IComparable<Player>
{
...
}
答案 1 :(得分:1)
您可以使用lambda表达式创建IComparer<Player>
(带Comparer<Type>.Create
)并在Array.Sort(array, comparer)
参数中传递它。代码段:
Comparer<Player> scoreComparer =
Comparer<Player>.Create((first, second) => first.Score.CompareTo(second.Score));
Array.Sort(tab, scoreComparer);