Сортировка массива объектов на основе параметра с помощью IComparable

#c# #sorting #arraylist #icomparable

#c# #сортировка #список массивов #icomparable

Вопрос:

Я создал небольшую тестовую программу, чтобы получить некоторый опыт работы с интерфейсом IComparable на C #. Мне нужно использовать интерфейс для других вещей в будущем.

В программе я хотел бы отсортировать список клиентов на основе зарплаты. Выполняя свой код, я всегда получаю «System.Исключение InvalidOperationException«.

Я уже пробовал разные версии кода и проверил несколько руководств, всегда с одним и тем же результатом.

Мой код:

 using System;
using System.Collections;

namespace CsTest
{
    public class Program
    {
        public static void Main()
        {
            Customer customer1 = new Customer()
            {
                ID = 101,
                Name = "Ted",
                Salary = 4000
            };

            Customer customer2 = new Customer()
            {
                ID = 102,
                Name = "Tod",
                Salary = 7000
            };

            Customer customer3 = new Customer()
            {
                ID = 103,
                Name = "Tom",
                Salary = 5500
            };

            ArrayList listCustomers = new ArrayList();
            listCustomers.Add(customer1);
            listCustomers.Add(customer2);
            listCustomers.Add(customer3);

            Console.WriteLine("Customers before sorting");
            foreach (Customer customer in listCustomers)
            {
                Console.WriteLine(customer.Name   " - "   customer.Salary);
            }

            // Sort() method should sort customers by salary
            listCustomers.Sort();

            Console.WriteLine("Customers after sorting");
            foreach (Customer customer in listCustomers)
            {
                Console.WriteLine(customer.Name   " - "   customer.Salary);
            }
        }
    }

public class Customer : IComparable<Customer>
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Salary { get; set; }

        public int CompareTo(Customer obj)
        { 
            return this.Salary.CompareTo(obj.Salary);
        }
    }
}
  

Комментарии:

1. Откуда вы получаете это исключение и почему вы используете ArrayList вместо List ?

Ответ №1:

Есть ли конкретная причина, по которой вы хотите использовать ArrayList вместо a List<Customer> ? В целом предлагается типизированный список, поскольку он будет принимать только объекты указанного типа.

Проблема здесь в том, что ArrayList.Sort() не используется IComparable интерфейс. Проверьте замечания здесь, где говорится, что вы должны реализовать IComparer интерфейс и использовать .Sort(comparer) перегрузку.

Это ваш единственный вариант. Другой вариант (намного проще) — использовать a List<Customer> , и он будет использовать вашу IComparable реализацию из коробки. Ваш выбор 🙂

Комментарии:

1. На самом деле я использовал ArrayList только потому, что он также использовался в учебниках. Я пробовал с помощью List<>, и все работало нормально. Большое спасибо!

2. Да ArrayList , в настоящее время этого следует избегать. Его старший кузен List<T> делает то же самое и гораздо более универсален и безопасен.

Ответ №2:

Вот решение с использованием исходного массива

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main()
        {
            Customer customer1 = new Customer()
            {
                ID = 101,
                Name = "Ted",
                Salary = 4000
            };

            Customer customer2 = new Customer()
            {
                ID = 102,
                Name = "Tod",
                Salary = 7000
            };

            Customer customer3 = new Customer()
            {
                ID = 103,
                Name = "Tom",
                Salary = 5500
            };

            ArrayList listCustomers = new ArrayList();
            listCustomers.Add(customer1);
            listCustomers.Add(customer2);
            listCustomers.Add(customer3);

            Console.WriteLine("Customers before sorting");
            foreach (Customer customer in listCustomers)
            {
                Console.WriteLine(customer.Name   " - "   customer.Salary);
            }

            // Sort() method should sort customers by salary

            Customer sortCustomer = new Customer();
            listCustomers.Sort(sortCustomer);

            Console.WriteLine("Customers after sorting");
            foreach (Customer customer in listCustomers)
            {
                Console.WriteLine(customer.Name   " - "   customer.Salary);
            }
        }
    }

    public class Customer : IComparer 
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Salary { get; set; }

          int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( ((Customer)x).Salary, ((Customer)y).Salary) );
        }
    }
}
  

Комментарии:

1. итак, мне нужно использовать Linq для сортировки массива?