#c# #arrays #sorting #icomparable
#c# #массивы #сортировка #icomparable
Вопрос:
Я написал программу для своего класса C #, и мне нужно выяснить, как реализовать IComparable, чтобы иметь возможность сортировать массив пользовательского типа. Он компилируется без ошибок, но выдает исключение при запуске:
Система.Исключение InvalidOperationException: не удалось сравнить два элемента в массиве. —> Система.Исключение ArgumentException: По крайней мере, один объект должен реализовывать IComparable.
Я часами искал решение, но безрезультатно. Есть масса информации по этому вопросу, но я, вероятно, просто переоцениваю ее. Я опубликую программу, и если кто-нибудь сможет указать мне правильное направление с объяснением, я был бы бесконечно благодарен, поскольку крайний срок для этого быстро приближается.
P.S. Это моя первая публикация здесь, поэтому, пожалуйста, будьте нежны, критикуя мои недостатки.
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);
}
}
}
Комментарии:
1.
Player
необходимо реализоватьIComparable
. Хотя не уверен, в чем вопрос. Ответ на вопрос в названии таков: вы реализуете IComparable.2. Для того, чтобы ваше решение работало, вам необходимо реализовать IComparable для класса Player. Для этого вам нужно знать, как вы хотите сортировать игроков в первую очередь. Например. вы можете сортировать по инициалам или счету.
Ответ №1:
Сообщение об исключении совершенно ясно.
must implement IComparable
Это означает, что вы должны реализовать IComparable
для своего Player
класса.
public class Player : IComparable<Player>
{
...
}
Комментарии:
1. Спасибо за быстрый ответ. Думаю, мне следовало упомянуть, что мне нужно отсортировать массив по баллам, синхронизируя инициалы с ними.
2. Он должен реализовывать
IComparable<Player>
, а неIComparable
. Дополнение: в качестве альтернативы, он мог бы использовать другую перегрузкуArray.Sort
, которая принимает дополнительный параметр, указывающий, как сравнивать игроков.3. Как это будет вставлено в тело конструктора?
Ответ №2:
Вы можете использовать лямбда-выражение для создания 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);
Комментарии:
1. Все еще полезен после стольких лет! 🙂