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

Страница 478 из 502

Приведенный ниже пример программы является вариантом рассматривавшегося ранее необобщенного примера программы учета товарных запасов, переделанного с целью воспользоваться интерфейсом IComparer для сортировки перечня товарных запасов. В этом варианте программы сначала создается класс CompInv, в котором реализуется интерфейс IComparer и сравниваются два объекта класса Inventory. А затем объект класса Complnv указывается в вызове метода Sort() для сортировки перечня товарных запасов.

<b>// Применение необобщеннкого варианта интерфейса  IComparer </b>

<b>using System;</b>

<b>using System.Collections;</b>

<b>// Создать объект типа IComparer для объектов класса Inventory,</b>

<b>class CompInv : IComparer {</b>

<b>  // Реализовать интерфейс IComparer.</b>

<b>  public int Compare(object x, object y) {</b>

<b>    Inventory a, b;</b>

<b>    a = (Inventory)x;</b>

<b>    b = (Inventory)y;</b>

<b>    return string.Compare(a.name, b.name, StringComparison.Ordinal);</b>

<b>  }</b>

<b>}</b>

<b>class Inventory {</b>

<b>  public 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() {</b>

<b>    return</b>

<b>    String.Format(&quot;{0,-10} Цена: {1,6:С} В наличии: {2}&quot;,</b>

<b>name, cost, onhand);</b>

<b>  }</b>

<b>}</b>

<b>class IComparerDemo {</b>

<b>  static void Main() {</b>

<b>    CompInv comp = new CompInv();</b>

<b>    ArrayList inv = new ArrayList();</b>

<b>    // Добавить элементы в список.</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>    // Отсортировать список, используя интерфейс IComparer.</b>

<b>    inv.Sort(comp);</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>

Эта версия программы дает такой же результат, как и предыдущая.

Интерфейс IComparer&lt;T&gt; является обобщенным вариантом интерфейса IComparer. В нем определяется приведенный ниже обобщенный вариант метода Compare().

<b>int Compare(Т х, Т у)</b>

В этом методе сравниваются объекты х и у и возвращается нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта х больше, чем у объекта у; и отрицательное — если значение объекта х меньше, чем у объекта у.

Ниже приведена обобщенная версия предыдущей программы учета товарных запасов, в которой теперь используется интерфейс IComparer&lt;Т&gt;. Она дает такой же результат, как и необобщенная версия этой же программы.

<b>// Использовать обобщенный вариант интерфейса IComparer&lt;T&gt;.</b>

<b>using System;</b>

<b>using System.Collections.Generic;</b>

<b>// Создать объект типа IComparer&lt;T&gt; для объектов класса Inventory,</b>

<b>class CompInv&lt;T&gt; : IComparer&lt;T&gt; where T : Inventory {</b>

<b>  // Реализовать интерфейс IComparer&lt;T&gt;.</b>

<b>  public int Compare(T x, T y) {</b>

<b>    return string.Compare(x.name, y.name, StringComparison.Ordinal);</b>