Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1391-1497.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
126.26 Кб
Скачать

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 ().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]