Программирование >>  Обработка исключительных ситуаций 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 142


string name;

int health, ammo;

class CI ass 1 { static void MainO {

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 el em in stado ) elem.Passport();

Результат работы программы:

Monster Мса health = 40 ammo = 10 Monster Вася health = 50 ammo = 50 Monster Петя health = 80 ammo = 80

Если несколько объектов имеют одинаковое значение критерия сортировки, их относительный порядок следования после сортировки не изменится.

Во многих алгоритмах требуется выполнять сортировку объектов по различным критериям. В С# для этого используется интерфейс I Comparer, который рассмотрен в следующем разделе.

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

Интерфейс IComparer определен в пространстве имен System. Col lections. Он содержит один метод CompareTo, возвращающий результат сравнения двух объектов, переданных ему в качестве параметров:

interface IComparer

int Compare ( object obi, object ob2 )

Листинг 9.1 (продолжение)

Monster temp = (Monster) obj; if ( this.health > temp.health ) return 1; if ( this.health < temp.health ) return -1; return 0;



Принцип применения этого интерфейса состоит в там, что для каждого критерия сортировки объектов описывается небольшой вспомогательный класс, реализующий этот интерфейс. Объект этого класса передается в стандартный метод сортировки массива в качестве второго аргумента (существует несколько перегруженных версий этого метода).

Пример сортировки массива объектов из предыдущего листинга по именам (свойство Name, класс SortByName) и количеству вооружений (свойство Ammo, класс EortByAmmo) приведен в листинге 9.2. Классы параметров сортировки объявлены вложенными, поскольку они требуются только объектам класса Monster.

Листинг 9.2. Сортировка по двум критериям .sing System;

.sing System.Col lections ; amespace ConsoleApplicationi

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 PassportO

Console.WriteLineC Monster {0} \t health = {1} ammo = {2} , name, health, ammo );

public class SortByName : IComparer

int IComparer.Compare( object obi, object ob2 )



Листинг 9.2 (продолжение)

Monster ml = (Monster) obi: Monster m2 = (Monster) ob2; return String.Compare( m1.Name, m2.Name

public class SortByAmmo

IComparer

int. {

IComparer.Compare( object obi, object ob2 )

Monster ml - (Monster) obi:

Monster ni2 - (Monster) ob2;

if ( ml.Ammo > m2.Ammo ) return 1;

if ( ml.Ammo < m2.Ammo ) return -1; return 0.

string name:

mt health, ammo;

Class Class1

{ static void Mam()

const int n=3. Monsterr3 stado <

new Monster],

stado[0] = new Monster( 50. 50. Вася ); stado[l] = new Monster( 80. 80. Петя ); stado[2] = new Monster( 40. 10. Маша ):

Console.WriteLine( Сортировка по имени: ); Array.Sort( stado, new Monster SortByNameО j; foreach ( Monster el em in stado ) el em. Passport,).

Console.WriteLine( Сортировке по вооружению *:: Array.Sort ( stado. new Monster.SortByAmmoO ); foreach ( Monster elem in stado ) elem.Passport();

Результат работы программы: Сортировка по имени:

Monster Вася health 50 ammo 50

Monster Маша health = 40 ammo 10 Monster Петя health = 80 ammo 30



1 ... 30 31 32 [ 33 ] 34 35 36 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика