Интерфейс IComparer определен в пространстве имен System.Collections. Он содержит один метод CompareTo, возвращающий результат сравнения двух объектов, переданных ему в качестве параметров:
interface IComparer
{
int Compare (object ob1, object ob2)
}
Принцип применения этого интерфейса состоит в там, что для каждого критерия сортировки объектов описывается небольшой вспомогательный класс, реализующий этот интерфейс. Объект этого класса передается в стандартный метод сортировки массива в качестве второго аргумента (существует несколько перегруженных версий этого метода).
Пример сортировки массива объектов из предыдущего листинга по именам (свойство Name, класс SortByName) и количеству вооружений (свойство Ammo, класс SortByAmmo) приведен в листинге 9.2. Классы параметров сортировки объявлены вложенными, поскольку они требуются только объектам класса Monster.
Листинг 9.2. Сортировка по двум критериям
using System;
using System.Collections;
namespace ConsoleApplication1
{
class Monster
{
public Monster(int health, int ammo, string name)
{
this.health = health;
this.ammo = ammo; this.name = name;
|
|
}
public int Ammo
{
get { return ammo; }
set
{
if (value > 0) ammo = value; else ammo = 0;
}
}
public string Name
{
get { return name; }
}
virtual public void Passport()
{
Console.WriteLine("Monster {0} \t health = {1} ammo = {2}",
name, health, ammo);
}
public class SortByName: IComparer //
{
int IComparer.Compare(object ob1, object ob2)
{
Monster ml = (Monster)ob1;
Monster m2 = (Monster)ob2;
return String.Compare(m1.Name.m2.Name);
}
}
public class SortByAmmo: IComparer //
{
int IComparer.Compare(object ob1, object ob2)
{
Monster ml = (Monster)ob1;
Monster m2 = (Monster)ob2;
if (m1.Ammo > m2.Ammo) return 1;
if (m1.Ammo < m2.Ammo) 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[1] - new Monster(80, 80, "Петя");
stado[2] = new Monster(40, 10, "Маша");
Console.WriteLine("Сортировка по имени:");
Array.Sort(stado, new Monster.SortByName());
foreach (Monster elem in stado) elem.Passport();
Console.WriteLine("Сортировка по вооружению:");
Array.Sort(stado, new Monster.SortByAmmo());
foreach (Monster elem in stado) elem.Passport();
}
}
}
Результат работы программы:
Сортировка по имени:
Monster Вася health = 50 ammo = 50
Monster Маша health = 40 ammo = 10
Monster Петя health = 80 ammo = 80
Сортировка по вооружению:
Monster Маша health = 40 ammo = 10
Monster Вася health = 50 ammo = 50
Monster Петя health = 80 ammo = 80