Сортировка по набору критериев (IComparer)
Сортировка по набору критериев (IComparer)
В этой версии типа Car в качестве критерия упорядочения мы использовали ID автомобиля, В другом случае для сортировки можно использовать, например, petName (чтобы разместить автомобили в алфавитном порядке их названий). Но что делать, если нужно отсортировать автомобили и по значению ID, и по значению petName? В этом случае вы должны использовать другой стандартный интерфейс, определенный в рамках пространства имен System.Collections, – интерфейс IComparer.
// Типичный способ сравнения двух объектов.
interface IComparer {
int Compare(object o1, object o2);
}
В отличие от IComparable, интерфейс IComparer обычно реализуют не с помощью типов, которые предполагается сортировать (в данном случае это типы Car), а с помощью некоторого набора вспомогательных классов, по одному для каждого порядка сортировки (petName, ID и т.д.). Тип Car (автомобиль) уже "знает", как сравнивать себя с другими автомобилями на основе внутреннего идентификатора ID. Чтобы позволить пользователю объекта отсортировать массив типов Car по значению petName, нам потребуется вспомогательный класс, реализующий IComparer. Вот подходящий для этого программный код.
// Этот вспомогательный класс используется для сортировки
// массива объектов Car по названию.
using System.Collections;
public class PetNameComparer : IComparer {
public PetNameComparer() {}
// Проверка названий объектов.
int IComраrer.Compare(object o1, object o2) {
Car t1 = (Car)о1;
Car t2 = (Car)o2;
return String.Compare (t1.petName, t2.petName);
}
}
Этот вспомогательный класс можно использовать в программном коде пользователя объекта. Класс System.Array предлагает перегруженный метод Sort(), один из вариантов которого допускает использование объекта, реализующего интерфейс IComparer (рис. 7.11).
static void Main (string[] args) {
…
// Теперь сортируем по имени.
Array.Sort(myAutos, new РеtNameComparer());
// Вывод отсортированного массива.
Consolе.WriteLine(" Упорядочение по названию");
foreach(Car e in myAutos) Console.WriteLine("{0} {1}", c.ID, c.petName);
…
}
Рис. 7.11. Сортировка автомобилей по названию