Как использовать интерфейсы IComparable в Visual C#

C Sharp > Как использовать интерфейсы IComparable в Visual C#
08.02.2018 17:01:17


Наиболее часто встречающиеся слова в статье:

[IComparable] [Реализуем] [интерфейса] [сравнения] [CompareTo] [override] [ToString] [Program] [foreach] [Console]


Статья:

Если требуется отсортировать коллекцию, состоящую из объектов определяемого пользователем класса, при условии, что они не сохраняются 
в коллекции класса SortedList, где элементы располагаются в отсортированном порядке, то в такой коллекции должен быть известен способ
 сортировки содержащихся в ней объектов. С этой целью можно, в частности, реализовать 
интерфейс IComparable для объектов сохраняемого типа. Интерфейс IComparable доступен в двух формах: обобщенной и необобщенной. 
Несмотря на сходство применения обеих форм 
данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия.
Если требуется отсортировать объекты, хранящиеся в необобщенной коллекции, то для этой цели придется реализовать необобщенный вариант 
интерфейса IComparable. В этом варианте 
данного интерфейса определяется только один метод, CompareTo(), который определяет порядок выполнения самого сравнения. 
Ниже приведена общая форма объявления метода CompareTo():
int CompareTo(object obj)
В методе CompareTo() вызывающий объект сравнивается с объектом obj. Для сортировки объектов по нарастающей конкретная реализация данного 
метода должна возвращать нулевое значение, 
если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта obj; и отрицательное —
 если значение вызывающего объекта меньше, 
чем у объекта obj. А для сортировки по убывающей можно обратить результат сравнения объектов. 
Если же тип объекта obj не подходит для сравнения с вызывающим объектом, то в методе CompareTo() может быть сгенерировано
 исключение ArgumentException.
 
using System;
class Box : IComparable {
 public int a,b; 
 public Box(int a, int b) 
 { this.a=a; this.b=b;
 }
 // Реализуем из интерфейса свой  метод сравнения
public int CompareTo(object obj)
{
Box box=(Box)obj; 
return a*b - box.a*box.b;
}
public override string ToString() {
 return a+" "+b;	
 
}
 
}
 
class Program {
static void Main(string[] args) {
Box []d=new Box[] {new Box(3,5),new Box(l,4)new Box(2,-l) };
 Array.Sort(d); 
 foreach(var item in d)
     Console.WriteLine(item);
 
  }
}