Читать «C# 4.0: полное руководство» онлайн - страница 636
Герберт Шилдт
Реализация интерфейса IComparable для необобщенных коллекций
Если требуется отсортировать объекты, хранящиеся в необобщенной коллекции, то для этой цели придется реализовать необобщенный вариант интерфейса IComparable
. В этом варианте данного интерфейса определяется только один метод, CompareTo()
, который определяет порядок выполнения самого сравнения. Ниже приведена общая форма объявления метода CompareTo()
.
int CompareTo(object obj)
В методе CompareTo()
вызывающий объект сравнивается с объектом CompareTo()
может быть сгенерировано исключение ArgumentException
.
В приведенном ниже примере программы демонстрируется конкретная реализация интерфейса IComparable
. В этой программе интерфейс IComparable
вводится в класс Inventory
, разработанный в двух последних примерах из предыдущего раздела. В классе Inventory
реализуется метод CompareTo()
для сравнения полей name объектов данного класса, что дает возможность отсортировать товарные запасы по наименованию. Как показано в данном примере программы, коллекция объектов класса Inventory подлежит сортировке благодаря реализации интерфейса IComparable
в этом классе.
// Реализовать интерфейс IComparable.
using System;
using System.Collections;
// Реализовать необобщенный вариант интерфейса IComparable.
class Inventory : IComparable {
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.
public int CompareTo(object obj) {
Inventory b;
b = (Inventory)obj;
return name.CompareTo(b.name);
}
}
class IComparableDemo {
static void Main() {
ArrayList inv = new ArrayList();
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);