Интерфейс ICcmparable определен в пространстве имен System. Он содержит всего один метод CompareTo, возвращающий результат сравнения двух объектов — текущего и переданного ему в качестве параметра:
interface IComparable
{
int CompareTo(object obj)
}
Метод должен возвращать:
□ 0, если текущий объект и параметр равны;
□ отрицательное число, если текущий объект меньше параметра;
□ положительное число, если текущий объект больше параметра.
Реализуем интерфейс IComparable в знакомом нам классе Monster. В качестве кри
терия сравнения объектов выберем поле health. В листинге 9.1 приведена про
грамма, сортирующая массив монстров по возрастанию величины, характери
зующей их здоровье (элементы класса, не используемые в данной программе, не
приводятся).
Листинг 9.1. Пример реализации интерфейса IComparable
using System;
namespace ConsoleApplication1
{
class Monster: IComparable
{
public Monster(int health, int ammo, string name)
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
virtual public void Passport()
{
Console.WriteLine("Monster {0} \t health - {1} ammo - {2}",
name, health, ammo);
}
public int CompareTo(object obj) // реализация интерфейса
{
Monster temp = (Monster)obj;
if (this.health > temp.health) return 1;
if (this.health < temp.health) return -1;
return 0;
}
string name;
int health, ammo;
}
class Class1
{
static void Main()
{
const int n = 3;
Monster[] stado = new Monster[n];
stado[0] = new Monster(50, 50, "Вася");
stado[l] = new Monster(80, 80, "Петя");
stado[2] = new Monster(40, 10, "Маша");
Array.Sort(stado); // сортировка стала возможной
foreach (Monster elem in stado) elem.Passport();
}
}
}
Результат работы программы:
Monster Маша health = 40 ammo = 10
Monster Вася health = 50 ammo = 50
Monster Петя health = 80 ammo = 80
Если несколько объектов имеют одинаковое значение критерия сортировки, их относительный порядок следования после сортировки не изменится. Во многих алгоритмах требуется выполнять сортировку объектов по различным критериям. В С# для этого используется интерфейс IComparer, который рассмотрен в следующем разделе.