Способы сортировки объектов коллекции Реализация интерфейса IComparable

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002177.docx

Способы сортировки объектов коллекции Реализация интерфейса 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.