C# 4.0 полное руководство - 2011
Шрифт:
В приведенном ниже примере программы демонстрируется конкретная реализация интерфейса IComparable. В этой программе интерфейс IComparable вводится в класс Inventory, разработанный в двух последних примерах из предыдущего раздела. В классе Inventory реализуется метод CompareTo для сравнения полей name объектов данного класса, что дает возможность отсортировать товарные запасы
// Реализовать интерфейс IComparable.
using System;
using System.Collections;
// Реализовать необобщенный вариант интерфейса IComparable. class Inventory : IComparable { string name; double cost; int onhand;
public Inventory(string n, double c, int h) { name = n; cost = c; onhand = h;
}
public override string ToStringO { return
String.Format ("{0,-10}Стоимость: {1,6:С} Наличие: {2}", name, cost, onhand);
}
// Реализовать интерфейс IComparable. public int CompareTo(object obj) {
Inventory b;
b = (Inventory) obj;
return name.CompareTo(b.name);
}
}
class IComparableDemo { static void Main {
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;
// Отсортировать список, inv.Sort;
Console.WriteLine("Перечень товарных запасов после сортировки:"), foreach(Inventory i in inv) {
Console.WriteLine(" " + i);
}
}
}
Ниже приведен результат выполнения данной программы. Обратите внимание на то, что после вызова метода Sort товарные запасы оказываются отсортированными по наименованию.
Перечень товарных запасов до сортировки:
Реализация интерфейса IComparable для обобщенных коллекций
Если требуется отсортировать объекты, хранящиеся в обобщенной коллекции, то для этой цели придется реализовать обобщенный вариант интерфейса IComparable<T>. В этом варианте интерфейса IComparable определяется приведенная ниже обобщенная форма метода CompareTo .
int CompareTo(Т other)
В методе CompareTo
Приведенный ниже пример программы является вариантом предыдущего примера, измененным с целью реализовать и использовать обобщенный интерфейс IComparable<T>. Обратите внимание на применение класса обобщенной коллекции List<T> вместо класса необобщенной коллекции ArrayList.
// Реализовать интерфейс IComparable<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:C} Наличие: {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);
}
}
}
Эта версия программы дает такой же результат, как и предыдущая, необобщенная версия.