Для сортировки объектов определяемых пользователем классов зачастую проще всего реализовать в этих классах интерфейс
IComparable.Тем не менее данную задачу можно решить и с помощью интерфейсаIComparer.Для этой цели необходимо сначала создать класс, реализующий интерфейсIComparer,а затем указать объект этого класса, когда потребуется сравнение.Интерфейс
IComparerсуществует в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия, рассматриваемые ниже.Применение необобщенного интерфейса icomparer
В необобщенном интерфейсе
IComparerопределяется только один метод,Compare().
int Compare(object x, object y)
В методе
Compare() сравниваются объектыxиу.Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объектаОбъект типа
IComparerможет быть указан при конструировании объекта классаSortedList,при вызове методаArrayList. Sort (IComparer),а также в ряде других мест в классах коллекций. Главное преимущество применения интерфейсаIComparerзаключается в том, что сортировке подлежат объекты тех классов, в которых интерфейсIComparableне реализуется.Приведенный ниже пример программы является вариантом рассматривавшегося ранее необобщенного примера программы учета товарных запасов, переделанного с целью воспользоваться интерфейсом
IComparerдля сортировки перечня товарных запасов. В этом варианте программы сначала создается классComp Inv,в котором реализуется интерфейсIComparerи сравниваются два объекта классаInventory.А затем объект классаComplnvуказывается в вызове методаSort() для сортировки перечня товарных запасов.using System;
using System.Collections;
// Создать объект типа IComparer для объектов класса Inventory, class CompInv : IComparer {
// Реализовать интерфейс IComparer. public int Compare(object x, object y) {
Inventory, a, b; a = (Inventory) x; b = (Inventory) y;
return string.Compare(a.name, b.name, StringComparison.Ordinal);
}
}
class Inventory { public string name; double cost; int onhand;
public Inventory(string n, double c, int h) { name = n; cost = c; onhand = h;
}