Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Сортировка по набору критериев (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("nУпорядочение по названию");
 foreach(Car e in myAutos) Console.WriteLine("{0} {1}", c.ID, c.petName);
 …
}


Рис. 7.11. Сортировка автомобилей по названию

Оглавление книги


Генерация: 1.179. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз