коллекции ArrayList.
// Реализовать интерфейс IComparable<T>. using System;
using System.Collections.Generic;
// Реализовать обобщенный вариант интерфейса IComparable<T>. class Inventory : IComparable<Inventory> { 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,-10}Стоимость: {1,6:C} Наличие: {2}', name, cost, onhand);
}
// Реализовать интерфейс IComparable<T>. public int CompareTo(Inventory obj) { return name.CompareTo(obj.name);
}
}
class GenericIComparableDemo { static void Main() {
List<Inventory> inv = new List<Inventory>();
// Добавить элементы в список. inv.Add(new Inventory('Кусачки', 5.95, 3)); inv.Add(new Inventory('Отвертки', 8.29, 2)); inv.Add(new’Inventory('Молотки', 3.50, 4)); inv.Add(new Inventory('Дрели', 19.88, 8
Console.WriteLine('Перечень товарных запасов до сортировки:'); foreach(Inventory i in inv) {
Console.WriteLine (' ' + i);
}
Console.WriteLine ();
// Отсортировать список, inv.Sort ();
Console.WriteLine('Перечень товарных запасов после сортировки:'); foreach(Inventory i in inv) {
Console.WriteLine (' ' + i);
}
}
}
Эта версия программы дает такой же результат, как и предыдущая, необобщенная версия.
Применение интерфейса IComparer
Для сортировки объектов определяемых пользователем классов зачастую проще всего реализовать в этих классах интерфейс IComparable. Тем не менее данную задачу можно решить и с помощью интерфейса IComparer. Для этой цели необходимо сначала создать класс, реализующий интерфейс IComparer, а затем указать объект этого класса, когда потребуется сравнение.
Интерфейс IComparer существует в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия, рассматриваемые ниже.
Применение необобщенного интерфейса icomparer
В необобщенном интерфейсе IComparer определяется только один метод,
Compare().
int Compare(object x, object y)
В методе Compare () сравниваются объекты x и у. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта
Объект типа IComparer может быть указан при конструировании объекта класса SortedList, при вызове метода ArrayList. Sort (IComparer), а также в ряде других мест в классах коллекций. Главное преимущество применения интерфейса IComparer заключается в том, что сортировке подлежат объекты тех классов, в которых интерфейс IComparable не реализуется.
Приведенный ниже пример программы является вариантом рассматривавшегося ранее
