|
Программирование >> Обработка исключительных ситуаций
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |