Г. Шилдт - С#4.0 Полное руководство (1160795), страница 203
Текст из файла (страница 203)
Обратите внимание на применение класса обобщенной коллекции ЫЯС<Т> вместо класса необобщенной коллекции АггаубфяС. Реализовать интерфейс 1СошрагаЫе<Т>. сяьпо Яуясеяо пялпд Яуягеш.со11есг1опя.сепег1с1 О Реализовать обобшенный вариант интерфейса 1СошрагаЬ1е<Т>. с1аяя 1пчепТогу : 1СошрагаЬ1е<1пчепгогу> ( яггьпо паше; боиЫе сояс; лпс опбапбт рпЫРс 1пчепгогу(ягг1п9 и, СоиЫе с, 1пг Ы ( паше = и) аозТ = с," опсапб = Ь; роЫьс очеггьбе яггтпс тоЯсг1п9() ( геТигп ЯСТ1пЯ.Рогшаг("(0,-10)стоимость: (1,6:С) Наличие: (2)", паше, пояс, опЬапб); ) // Реализовать интерфейс 1СошрагаЬ1е<т>. рпЬ11с 1пС Сошрагето(1пчепяогу оЬ3) ( гегигп паше.Сошрагето(оЪз.паше)) ) ) с1аяя Сепегьс1СошрагаЬ1ебешо ягаггс чоьб Мазп() ( ьаяс<1пчептогу> 1пч = пен тляс<1пчептогу>() // Добавить элементы в список.
1пч.лес)(пеы 1пчепгогу("Кусачки", 5.95, 3))," Гпч.лбс((пеы 1пчепгогу("Отвертки", 8.29, 2)); 1пч.льЫ (пен 1пчепгогу("МолоткиГЬ 3.50, 4)); 1пч.лсЫ(пеы 1пчепгогу("Дрели", 19.88, 81); сопяо1е,хгьсес1пе("перечень товарных запасов ло сортировки:") Тогеась(1пчепгогу 1 1п ьпч) ( Сопзо1е.нггТещпе(" " е 1); ) Сопяо1е. Игггет ьпе (); 1/ Отсортировать список. 1пч.Яогг()) Сопяо1е.нгггесьпе("Перечень товарных запасов после сортировки:"); гогеасЬ(1пчепгогу 1 ьп гпч) ( 994 Часть )). Библиотека С() Сапзо1е. Хггсеъгне (" ) ) ) ь г)г Эта версия программы дает такой же результат, как и предыдущая, необобшенная версия.
Применение интерфейса ХСошрагег Для сортировки объектов определяемых пользователем классов зачастую проще всего реализовать в этих классах интерфейс 1СоврагаЬ1е. Тем не менее данную задачу можно решить и с помощью интерфейса 1Соглрагег. Для этой цели необходимо сначала создать класс, реализующий интерфейс 1Соврагег, а затем указать объект этого класса, когда потребуется сравнение. Интерфейс 1Соврагег существует в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия, рассматриваемые ниже.
Применение необобщенного интерфейса тсошрагег В необобгценном интерфейсе 1Сотрагег определяется только один метод, Соыраге () . 1пг Соираге(оЬ)ест х, оЬ)ест у) // Использовать необобпенный вариант интерфейса 1Соирагег. азгпу Бузгегм из1пд Бузсеи.со11ессгопз; В методе Соглраге () сравниваются объекты х и у. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение обьекта х больше, чем у объекта у и отрицательное — если значение объекта х меньше, чем у объекта у.
А для сортировки по убывающей можно обратить результат сравнения объектов. Если же тип объекта х не подходит для сравнения с объектом у, то в методе Соирагето () может быть сгенерировано исключение АгопыепсЕхсергаоп. Объект типа 1Соврагег может быть указан при конструировании объекта класса Баггер Тес, при вызове метода Аггауъгз С. Богг (1Соырагег), а также в ряде других мест в классах коллекций. Главное преимущество применения интерфейса 1Соврагег заключаешься в том, что сортировке подлежат объекты тех классов, в которых интерфейс 1СопрагаЬ1е не реализуется.
Приведенный ниже пример программы является вариантом рассматривавшегося ранее необобшенного примера программы учета товарных запасов, переделанного с целью воспользоваться интерфейсом 1Совраге г для сортировки перечня товарных запасов. В этом варианте программы сначала создается класс сотр1пю в котором реализуется интерфейс 1Соглрагег и сравниваются два объекта класса 1птепгогу. А затем объект класса Соыр1от указывается в вызове метода Ботс () для сортировки перечня товарных запасов. Глава 25. Коллекции, перечислители и итераторы 995 О Создать объект типа 1Соырагег для объектов класса 1пчепкогу.
с1авв Соыр1пн : 1Соырагег ( г'У Реализовать интерфейс 1Соырагег. риЫ1с 1пс Сошраге(оЬЗесс х, оЬзесс у) ( 1пчепгогу. а, Ь; а = (1пчепгогу) х; Ь = (1пчепсогу) у! гесогп всгьпч.соыраге(а.паые, Ь.паке, зсгвп9Соырагввоп.огдьпа1) ) ) с1авв 1пнепсогу ( роЫас вгг1п9 паве; бооЬ1е сове; 1пс опЬапс(; роЫ1с 1пчепсогу(всг1п9 и, г(ооЫе с, гпс Ы паве = и) совг = с; оплапб = Ь; роЫлс очегг1г(е всггп9 тобсг1п9() ( гегогп бгг1п9.Гоыьас("(0,-10) Цена: (1,8:С) В наличии: (2)", паве, совс, оплапб)г с1авв 1СоырагегОеыо ( всас1с нолб Мавп() ( Сотр1пч сотр = пен Соыр1пн()г ЛггауЬлвс лпн = пен Лггаувавс(); // Добавить элементы в список. 1пч.ко(пен 1пчепсогу("Кусачки", 5.95, 3)); 1пч.кс(б(пен 1пчепсогу("Отвертки", 8.29, 2)); 1пч.йсЫ(пен 1пчепсогу("Молотки", 3.50, 4)); гпч.ЛСС(пен 1пчепсогу("Дрели", 19.88, 8)); Сопво1е.иг1гевапе("Перечень товарных запасов до сортировки:")Г богеасЬ(1пчепсогу 1 лп 1пч) ( Сопво1е.игтсе51пе(" " + 1); ) Сопво1е.
Игвсеьапе (); О Отсортировать список, используя интертейс 1Соырагег. 1пн.зогс(соыр); Сопво1е.иг1се51пе("Перечень товарных запасов после сортировки:"); богеасЬ(1пнепгогу 1 1п гпч) ( Сопво1е.иг1сепапе(" " + 1); ) Эта версия программы дает такой же результат, как и предыдущая. 996 Часть Н. Библиотека С№ Применение обобщенного интерфейса ХСошрагею<т> Интерфейс 1Совраге с<Т> является обобщенным вариантом интерфейса 1Саврагег. В нем определяется приведенный ниже обобщенный вариант метода Саврасе () . тпг Савраге(Т х, Т у) В этом методе сравниваются объекты х и у и возвращается нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта х больше, чем у объекта у; и отрицательное — если значение объекта х меньше, чем у объекта у.
Ниже приведена обобщенная версия предыдущей программы учета товарных запасов, в которой теперь используется интерфейс 1Саврагег<Т>. Она дает такой же результат, как и необобщенная версия этой же программы. О Использовать обобвенный вариант интерфейаа 1соврагег<Т>. пяьпч Буягевт пя1пч Яуягев.Со11ессьопя.оепегпат О Создать объект типа 1Соврагег<Т> дпн объектов класса 1пчепгогу. с1аяя Совр1пн<Т> : 1Соврагег<Т> ноете Т : 1пнепгогу ( т'т' Реализовать интерфейс 1Соврагег<т>. рпЫ1с 1пг Саврасе(Т х, Т у) ( гегпгп яггппд.саврасе(х.паве, у.патпе, Ягг1пчсоврагпяоп.огт)1па1)т ) ) с1аяя 1пчепСогу ( рпЪ1тс яггьпд паве; СопЬ1е аояст Тпс опьапаб рпЫ1с 1пнепгогу(вСггпч и, СопЫе с, 1пг Ы ( патпе = и," сояс = а; опьапт) = Ьт ! рпЫ1с очегг1ае ягг1пч Тозггьпч() ( гегогп Ясггпд.Гогвас("(0,-10) цена: (1,6тс) В наличии: (2)", пвпе, сояс, опьапб)т с1аяя Яепегтс1Соврагегоево ( вгаг1а чо1С Ма1п() ( Совртпч<1пнепгогу> совр = пеи Совр1пн<1пчепгогу>() Ььяг<1пчепаогу> 1пч = пен Ььят<1пнепсогу>()т О )(сбавить элементы в апиаок.
1он.йп(С((ПЕИ 1ПЧЕПСОГу("КуСаЧКИгч 5.95, 3))т (вава 25. 'комекции, перечисаитеви и итераторы 997 хпч.ясЫ(лен 1пчепгогу("Отвертки", 8.29, 2)); хпч.)(<Ы (пен 1пчепхогу("Молотки", 3.50, 4)); хпч.)СО<((пеи 1пчепхогу("Дрели", 19.88, 8)); Сопзо1е.игххеьйпе("Перечень товарных запасов до сортировки:"); 1огеаоп(1пчепгогу 1 1п хпн) ( Сопво1е.игхгевьпе(" " + х); ) Сопво1е.
Хгхгеъхпе (); // Отсортировать список, используя интерфейс 1Соврагег. хпн.Бого(совр); Сопзо1е.Хгххеььпе("Перечень товарных запасов после сортировки:"); Гогеао)с(1пнепхогу х 1п хпн) ( Сопво1е.игххепъпе(" " + 1); ) Применение класса З~к2л1дСоп1рагег В простых примерах из этой главы указывать явно способ сравнения символьных строк совсем не обязательно. Но это может потребоваться в тех случаях, когда строки сохраняются в отсортированной коллекции или когда строки ищутся либо сортиру- ются в коллекции.
Так, если строки должны быть отсортированы с учетом настроек одной культурной среды, а затем их приходится искать с учетом настроек другой культурной среды, то во избежание ошибок, вероятнее всего, потребуется указать способ сравнения символьных строк. Аналогичная ситуация возникает и при хешировании коллекции. Для подобных (и других) случаев в конструкторах классов некоторых коллекций предусмотрена поддержка параметра типа 1соврахег. С целью явно указать способ сравнения символьных строк этому параметру передается в качестве аргумента экземпляр объекта класса Бгг1пс9Соврахег.
Класс БхгхпоСоврахех был подробно описан в главе 21 при рассмотрении вопросов сортировки и поиска в массивах. В этом классе реализуются интерфейсы 1Соврагех, 1соврахех<Бхг1пс1>, 1ес)оа11хусоврахех, а также 1ечпа11хусоврахег<Бхх1по>. Следовательно, экземпляр объекта типа Бхг1пс1Соврагег может быть передан параметру типа 1соврагег в качестве аргумента. В классе Бхг1пс9соврагег определяется несколько доступных только для чтения свойств, возвращающих экземпляр объекта типа Бгх1пс)Соврагег, который поддерживает различные способы сравнения символьных строк.
Как пояснялось в главе 21, к числу этих свойств относятся следующие: СоххепХСо1гохе, СоггепХСО1гоге1с9похеСазе, 1пчах1апХСи1гоге, 1пчаххапХСО1гоге1с9погеСаве, Охс)1па1, а также Охс)1па11с9погеСазе. Все эти свойства можно использовать для явного указания способа сравнения символьных строк. В качестве примера ниже показано, как коллекция типа Бохгес)1188<ткеу, Туа1ое> конструируется для хранения символьных строк, ключи которых сравниваются порядковым способом.