Реализация интерфейса IComparable
Если требуется отсортировать коллекцию, состоящую из объектов определяемого пользователем класса, при условии, что они не сохраняются в коллекции класса SortedList, где элементы располагаются в отсортированном порядке, то в такой коллекции должен быть известен способ сортировки содержащихся в ней объектов. С этой целью можно, в частности, реализовать интерфейс IComparable для объектов сохраняемого типа. Интерфейс IComparable доступен в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия.
Если требуется отсортировать объекты, хранящиеся в необобщенной коллекции, то для этой цели придется реализовать необобщенный вариант интерфейса IComparable. В этом варианте данного интерфейса определяется только один метод, CompareTo(), который определяет порядок выполнения самого сравнения. Ниже приведена общая форма объявления метода CompareTo():
int CompareTo(object obj);
В методе CompareTo() вызывающий объект сравнивается с объектом obj. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта obj; и отрицательное — если значение вызывающего объекта меньше, чем у объекта obj. А для сортировки по убывающей можно обратить результат сравнения объектов. Если же тип объекта obj не подходит для сравнения с вызывающим объектом, то в методе CompareTo() может быть сгенерировано исключение ArgumentException.
Если требуется отсортировать объекты, хранящиеся в обобщенной коллекции, то для этой цели придется реализовать обобщенный вариант интерфейса IComparable<T>. В этом варианте интерфейса IComparable определяется приведенная ниже обобщенная форма метода CompareTo():
int CompareTo(Т other);
В методе CompareTo() вызывающий объект сравнивается с другим объектом other. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта другого other; и отрицательное — если значение вызывающего объекта меньше, чем у другого объекта other. А для сортировки по убывающей можно обратить результат сравнения объектов. При реализации обобщенного интерфейса IComparable<T> имя типа реализующего класса обычно передается в качестве аргумента типа.
Давайте рассмотрим пример реализации интерфеса IComparable<T> для сортировки базы данных автомагазина:
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class AutoShop : IComparable<AutoShop> { public string CarName { set; get; } public int MaxSpeed { get; set; } public double Cost { get; set; } public byte Discount { get; set; } public int ID { get; set; } public AutoShop() { } public AutoShop(string CarName, int MaxSpeed, double Cost, byte Discount, int ID) { this.CarName = CarName; this.MaxSpeed = MaxSpeed; this.Cost = Cost; this.Discount = Discount; this.ID = ID; } // Реализуем интерфейс IComparable<T> public int CompareTo(AutoShop obj) { if (this.Cost > obj.Cost) return 1; if (this.Cost < obj.Cost) return -1; else return 0; } public override string ToString() { return String.Format("{4}\tМарка: {0}\tМакс. скорость: {1}\tЦена: {2:C}\tСкидка: {3}%", this.CarName,this.MaxSpeed,this.Cost,this.Discount,this.ID); } } class Program { static void Main() { List<AutoShop> dic = new List<AutoShop>(); // Создадим множество автомобилей AutoShop[] autoArr = new AutoShop[5]; dic.Add(new AutoShop("Toyota Corolla", 180, 300000, 5, 1)); dic.Add(new AutoShop("VAZ 2114i", 160, 220000, 0, 2)); dic.Add(new AutoShop("Daewoo Nexia", 140, 260000, 5, 3)); dic.Add(new AutoShop("Honda Torneo", 220, 400000, 7, 4)); dic.Add(new AutoShop("Audi R8 Best", 360, 4200000, 3, 5)); Console.WriteLine("Исходный каталог автомобилей: \n"); foreach (AutoShop a in dic) Console.WriteLine(a); Console.WriteLine("\nТеперь автомобили отсортированны по стоимости: \n"); dic.Sort(); foreach (AutoShop a in dic) Console.WriteLine(a); Console.ReadLine(); } } }
Комментарии