- •939 Сторінка в djvu 54 сторінка
- •Int Count { get; } bool IsReadOnly { get; }
- •Int Compare(т х, т у)
- •Int CompareTo(object obj)
- •Int CompareTo(т other)
- •Int Compare(object X, object y)
- •Int Compare(т х, т у)
- •Inv.Add(new Inventory("Викрутки", 8.29, 2)); inv.Add(new Inventory("Молотки", 3.50, 4)); inv.Add(new Inventory("Дриля", 19.88, 8));
- •Void Reset()
Int CompareTo(т other)
У методі CompareTo () зухвалий об'єкт рівняється з іншим об'єктом other. Для сортування об'єктів по наростаюча конкретна реалізація даного методу повинна повертати нульове значення, якщо значення порівнюваних об'єктів рівні; позитивне — якщо значення зухвалого об'єкта больще, чим в об'єкта іншого other; і негативне — якщо значення зухвалого об'єкта менше, ніж в іншого об'єкта other. А для сортування по убутні можна звернути результат порівняння об'єктів. При реалізації узагальненого інтерфейсу IComparable<T> ім'я типу реалізуючого класу звичайно передається як аргумент типу.
Приведенный нижче приклад програми є варіантом попереднього приклада, зміненим з метою реалізувати й використати узагальнений інтерфейс IComparable<T>. Зверніть увагу на застосування класу узагальненої колекції List<T> замість класу неузагальненої колекції ArrayList.
// Реалізувати інтерфейс CompareTo<T> using System;
using System.Collections.Generic;
// Реалізувати узагальнений варіант інтерфейсу IComparable<T>. class Inventory : IComparable<Inventory> { 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:З) Наявність: (2)", name, cost, onhand);
}
// Реалізувати інтерфейс IComparable<T>. public int CompareTo(Inventory obj) { return name.CompareTo(obj.name);
)
class GenericIComparableDemo { static void Main() {
List<Inventory> inv = new List<Inventory>();
// Додати елементи в список. 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);
}
}
Ця версія програми дає такий же результат, як і попередня, неузагальнена версія.
Застосування інтерфейсу IComparer
Для сортування об'єктів обумовлених користувачем класів найчастіше найпростіше реалізувати в цих класах інтерфейс IComparable. Проте дане завдання можна вирішити й за допомогою інтерфейсу IComparer. Для цієї мети необхідно спочатку створити клас, що реалізує інтерфейс IComparer, а потім указати об'єкт цього класу, коли буде потрібно порівняння.
Інтерфейс IComparer існує у двох формах: узагальненої й неузагальненої. Незважаючи на подібність застосування обох форм даного інтерфейсу, між ними є деякі, хоча й невеликі, відмінності, розглянуті нижче.
Застосування неузагальненого інтерфейсу IComparer
У неузагальненому інтерфейсі IComparer визначається тільки один метод, Compare().
Int Compare(object X, object y)
У методі Compare () рівняються об'єкти x i y. Для сортування об'єктів по наростаюча конкретна реалізація даного методу повинна повертати нульове значення, якщо значення порівнюваних об'єктів рівні; позитивне - якщо значення об'єкта х більше, ніж в об'єкта y; і негативне - якщо значення об'єкта х менше, ніж в об'єкта y. А для сортування по убутні можна звернути результат порівняння об'єктів. Якщо ж тип об'єкта х не підходить для порівняння з об'єктом y, то в методі CompareTo() може бути сгенерировано виключення ArgumentException.
Об'єкт типу IComparer може бути зазначений при конструюванні об'єкта класу SortedList, при виклику методу ArrayList. Sort (IComparer), а також у ряді інших місць у класах колекцій. Головна перевага застосування інтерфейсу IComparer полягає в тім, що сортуванню підлягають об'єкти тих класів, у яких інтерфейс IComparable не реалізується.
Наведений нижче приклад програми є варіантом раніше неузагальненого приклада, що розглядався, програми обліку товарних запасів, переробленого з метою скористатися інтерфейсом IComparer для сортування переліку товарних запасів. У цьому варіанті програми спочатку створюється клас Complnv, у якому реалізується інтерфейс IComparer і рівняються два об'єкти класу Inventory. А потім об'єкт класу Complnv указується у виклику методу Sort () для сортування переліку товарних запасів.
using System;
using System.Collections;
// Створити об'єкт типу IComparer для об'єктів класу Inventory, class Complnv : IComparer {
// Реалізувати інтерфейс IComparer. public int Compare(object x, object y) {
Inventory, a, b; a = (Inventory) x; b = (Inventory) y;
return string.Compare(a.name, b.name, StringComparison.Ordinal);
)
class Inventory { public 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);
)
}
class IComparerDemo { static void Main() {
Complnv comp = new Complnv();
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();
// Відсортувати список, використовуючи інтерфейс IComparer. inv.Sort(comp);
Console.WriteLine("Перелік товарних запасів після сортування:"); foreach(Inventory i in inv) {
Console.WriteLine(" " + i);
}
}
Застосування узагальненого інтерфейсу IComparer<T>
Інтерфейс IComparer<T> є узагальненим варіантом інтерфейсу IComparer. У ньому визначається наведений нижче узагальнений варіант методу Compare ().
