Страница 476 из 502
<b>int CompareTo(object obj)</b>
В методе CompareTo() вызывающий объект сравнивается с объектом obj. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта obj; и отрицательное — если значение вызывающего объекта меньше, чем у объекта obj. А для сортировки по убывающей можно обратить результат сравнения объектов. Если же тип объекта obj не подходит для сравнения с вызывающим объектом, то в методе CompareTo() может быть сгенерировано исключение ArgumentException.
В приведенном ниже примере программы демонстрируется конкретная реализация интерфейса IComparable. В этой программе интерфейс IComparable вводится в класс Inventory, разработанный в двух последних примерах из предыдущего раздела. В классе Inventory реализуется метод CompareTo() для сравнения полей name объектов данного класса, что дает возможность отсортировать товарные запасы по наименованию. Как показано в данном примере программы, коллекция объектов класса Inventory подлежит сортировке благодаря реализации интерфейса IComparable в этом классе.
<b>// Реализовать интерфейс IComparable.</b>
<b>using System;</b>
<b>using System.Collections;</b>
<b>// Реализовать необобщенный вариант интерфейса IComparable.</b>
<b>class Inventory : IComparable {</b>
<b> string name;</b>
<b> double cost;</b>
<b> int onhand;</b>
<b> public Inventory(string n, double c, int h) {</b>
<b> name = n;</b>
<b> cost = c;</b>
<b> onhand = h;</b>
<b> }</b>
<b> public override string ToString() { return</b>
<b>String.Format ("{0,-10}Стоимость: {1,6:C} Наличие: {2}", name, cost, onhand);</b>
<b> }</b>
<b> // Реализовать интерфейс IComparable.</b>
<b> public int CompareTo(object obj) {</b>
<b> Inventory b;</b>
<b> b = (Inventory)obj;</b>
<b> return name.CompareTo(b.name);</b>
<b> }</b>
<b>}</b>
<b>class IComparableDemo {</b>
<b> static void Main() {</b>
<b> ArrayList inv = new ArrayList();</b>
<b> inv.Add(new Inventory("Кусачки", 5.95, 3));</b>
<b> inv.Add(new Inventory("Отвертки", 8.29, 2));</b>
<b> inv.Add(new Inventory("Молотки", 3.50, 4));</b>
<b> inv.Add(new Inventory("Дрели", 19.88, 8));</b>
<b> Console.WriteLine("Перечень товарных запасов до сортировки:");</b>
<b> foreach (Inventory i in inv) {</b>
<b> Console.WriteLine(" " + i);</b>
<b> }</b>
<b> Console.WriteLine();</b>
<b> // Отсортировать список,</b>
<b> inv.Sort();</b>
<b> Console.WriteLine("Перечень товарных запасов после сортировки:");</b>
<b> foreach (Inventory i in inv) {</b>
<b> Console.WriteLine(" " + i);</b>
<b> }</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения данной программы. Обратите внимание на то, что после вызова метода Sort() товарные запасы оказываются отсортированными по наименованию.
<b>Перечень товарных запасов до сортировки:</b>
<b> Кусачки Стоимость: $5,95 Наличие: 3</b>
<b> Отвертки Стоимость: $8,29 Наличие: 2</b>
<b> Молотки Стоимость: $3,50 Наличие: 4</b>
<b> Дрели Стоимость: $19,88 Наличие: 8</b>
<b>Перечень товарных запасов после сортировки:</b>
<b> Дрели Стоимость: $19,88 Наличие: 8</b>
<b> Кусачки Стоимость: $5,95 Наличие: 3</b>
<b> Молотки Стоимость: $3,50 Наличие: 4</b>
<b> Отвертки Стоимость: $8,29 Наличие: 2</b>
Если требуется отсортировать объекты, хранящиеся в обобщенной коллекции, то для этой цели придется реализовать обобщенный вариант интерфейса IComparable<T>. В этом варианте интерфейса IComparable определяется приведенная ниже обобщенная форма метода CompareTo().