Способы сортировки объектов коллекции Реализация интерфейса IComparable
Если необходимо отсортировать динамический массив (типа ArrayList) объектов, определенных пользователем (или, если вам понадобится со- хранить эти объекты в коллекции типа SortedList), то вы должны сооб- щить коллекции информацию о том, как сравнивать эти объекты.
Один из способов — реализовать интерфейс IComparable.
В этом интерфейсе определен только один метод CompareTo(), кото- рый позволяет определить, как должно выполняться сравнение объектов соответствующего типа. Общий формат использования метода CompareTo() таков:
int CompareTo (object obj)
Метод CompareTo() сравнивает вызывающий объект с объектом, за- данным параметром obj. Чтобы отсортировать объекты коллекции в воз- растающем порядке, этот метод (в вашей реализации) должен возвра- щать нуль, если сравниваемые объекты равны положительное значение, если вызывающий объект больше объекта obj, и отрицательное число, если вызывающий объект меньше объекта obj.
Для сортировки в убывающем порядке достаточно инвертировать ре- зультат описанного сравнения. Метод CompareTo() может сгенерировать
исключение типа ArgumentException, если тип объекта obj несовместим с вызывающим объектом.
//Реализация интерфейса IComparable.
using System;
using System.Collections;
class Inventory : IComparable
{
string name; double cost; int onhand;
public Inventory(string n, double c, int h)
{
name = n;
cost = c; onhand = h;
}
public override string ToString()
{
return String.Format("{0, -16}Цена: {1,8:C} В наличии: {2}",
name, cost, onhand);
}
// Реализуем интерфейс IComparable. public int CompareTo(object obj)
{
Inventory b;
b = (Inventory)obj;
return this.name.CompareTo(b.name);
}
}
class IcomparableDemo
{
public static void Main()
{
ArrayList inv = new ArrayList();
inv.Add(new Inventory("Плоскогубцы", 5.95, 3));
inv.Add(new Inventory("Гаечные ключи", 8.29, 2));
inv.Add(new Inventory("Молотки", 3.50, 4));
Console.WriteLine("---Информация до сортировки:"); foreach (Inventory i in inv)
Console.WriteLine(" " + i);
// Сортируем список. inv.Sort();
Console.WriteLine("---Информация после сортировки:"); foreach (Inventory i in inv)
Console.WriteLine(" " + i);
}
}
Здесь метод сортировки предоставил исходный класс Inventory.
А как быть, если класс не реализует интерфейс IComparable?
В этом случае можно воспользоваться интерфейсом IComparer.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.