#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 для сортировки массива?