Добавить в цитаты Настройки чтения

Страница 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 (&quot;{0,-10}Стоимость: {1,6:C} Наличие: {2}&quot;, 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(&quot;Кусачки&quot;, 5.95, 3));</b>

<b>    inv.Add(new Inventory(&quot;Отвертки&quot;, 8.29, 2));</b>

<b>    inv.Add(new Inventory(&quot;Молотки&quot;, 3.50, 4));</b>

<b>    inv.Add(new Inventory(&quot;Дрели&quot;, 19.88, 8));</b>

<b>    Console.WriteLine(&quot;Перечень товарных запасов до сортировки:&quot;);</b>

<b>    foreach (Inventory i in inv) {</b>

<b>      Console.WriteLine(&quot;    &quot; + i);</b>

<b>    }</b>

<b>    Console.WriteLine();</b>

<b>    // Отсортировать список,</b>

<b>    inv.Sort();</b>

<b>    Console.WriteLine(&quot;Перечень товарных запасов после сортировки:&quot;);</b>

<b>    foreach (Inventory i in inv) {</b>

<b>      Console.WriteLine(&quot;    &quot; + 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&lt;T&gt;. В этом варианте интерфейса IComparable определяется приведенная ниже обобщенная форма метода CompareTo().