Сортировка по разным критериям (интерфейс IComparer)

Интерфейс 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: