Как вы реализуете IComparable для сортировки массива пользовательского типа?

#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. Все еще полезен после стольких лет! 🙂