Страница 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("{0,-10} Цена: {1,6:С} В наличии: {2}",</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("Кусачки", 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> // Отсортировать список, используя интерфейс IComparer.</b>
<b> inv.Sort(comp);</b>
<b> Console.WriteLine("Перечень товарных запасов после сортировки:");</b>
<b> foreach (Inventory i in inv) {</b>
<b> Console.WriteLine(" " + i);</b>
<b> }</b>
<b> }</b>
<b>}</b>
Эта версия программы дает такой же результат, как и предыдущая.
Интерфейс IComparer<T> является обобщенным вариантом интерфейса IComparer. В нем определяется приведенный ниже обобщенный вариант метода Compare().
<b>int Compare(Т х, Т у)</b>
В этом методе сравниваются объекты х и у и возвращается нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта х больше, чем у объекта у; и отрицательное — если значение объекта х меньше, чем у объекта у.
Ниже приведена обобщенная версия предыдущей программы учета товарных запасов, в которой теперь используется интерфейс IComparer<Т>. Она дает такой же результат, как и необобщенная версия этой же программы.
<b>// Использовать обобщенный вариант интерфейса IComparer<T>.</b>
<b>using System;</b>
<b>using System.Collections.Generic;</b>
<b>// Создать объект типа IComparer<T> для объектов класса Inventory,</b>
<b>class CompInv<T> : IComparer<T> where T : Inventory {</b>
<b> // Реализовать интерфейс IComparer<T>.</b>
<b> public int Compare(T x, T y) {</b>
<b> return string.Compare(x.name, y.name, StringComparison.Ordinal);</b>