Возвращаемое значение | Описание |
---|---|
Любое число, меньшее нуля | В данном порядке сортировки текущий экземпляр размещается до указанного объекта |
Нуль | Этот экземпляр равен указанному объекту |
Любое число, большее нуля | В данном порядке сортировки текущий экземпляр размещается после указанного объекта |
Теперь, когда тип Car "умеет" сравнивать себя с подобными объектами, вы можете записать пользовательский программный код следующего вида.
// Проверка интерфейса IComparable.
static void Main(string[] args) {
// Создание массива типов Car.
// Вывод исходного массива
Console.WriteLine("Несортированный набор машин:");
foreach(Car с in myAutos) Console.WriteLine("{0) (1}", с.ID, с.petName);
// Теперь сортируем их с помощью IComparable.
Array.Sort(myAutos);
// Вывод отсортированного массива.
Console.WriteLine("\nУпорядоченный набор машин:");
foreach(Car с in myAutos) Console.WriteLine("{0} {1}", с.ID, с.petName);
Console.ReadLine;
}
На рис. 7.10 показан соответствующий вывод.
Рис. 7.10. Сравнение автомобилей на основе значений ID
Сортировка по набору критериев (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
}
}
Этот вспомогательный класс можно использовать в программном коде пользователя объекта. Класс System.Array предлагает перегруженный метод Sort, один из вариантов которого допускает использование объекта, реализующего интерфейс IComparer (рис. 7.11).
static void Main (string[] args) {
…
// Теперь сортируем по имени.
Array.Sort(myAutos, new РеtNameComparer);
// Вывод отсортированного массива.
Consolе.WriteLine("\nУпорядочение по названию");
foreach(Car e in myAutos) Console.WriteLine("{0} {1}", c.ID, c.petName);
…
}
Рис. 7.11. Сортировка автомобилей по названию
Типы, определяющие сортировку, и пользовательские свойства