Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 143
Текст из файла (страница 143)
Все методы, определенные в классе дггау, автоматически доступны для обработки массивов всех встроенных в С(т типов значений. Но в отношении массивов ссылок иа объекты это правило может и ие соблюдаться. Так, для сортировки массива ссылок иа объекты в классе типа этих объектов должен быть реализован интерфейс 1СоврагаЬ1е или 1СоврагаЬ1е<Т>. Если же ни один из этих интерфейсов ие реализован в данном классе, то во время выполнения программы может возникнуть исключительная ситуация в связи с попыткой отсортировать подобный массив или осуществить в ием поиск. Правда, реализовать оба интерфейса, 1соврагаые и 1СоврагаЬ1е<Т>,совсем нетрудно.
В интерфейсе 1СоврагаЫе определяется один метод: ьпа Соврагето(оп)есг оой) В этом методе зиачеиие вызывающего объекта сравнивается со значением объекта, определяемого параметром оЬОЬ Если значение вызывающего объекта больше, чем у объекта оьз, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта ОЬ31 — отрицательное значение. Интерфейс 1СоврагаЬ1е<Т> является обобщенным вариантом интерфейса 1СоврагаЬ1е.
Поэтому в ием определен следующий обобщенный вариант метода Соврагето(); 1па Соврагето(т оьй) Обобшеииый вариант метода соврагето () действует аналогично иеобобщеииому его варианту. В ием значение вызывающего объекта также сравнивается со значением объекта, определяемого параметром оЬсЬ Если значение вызывающего объекта больше, чем у объекта ОЬЗЧ то возвращается положительное значение; если оба значения равны — пулевое значение, а если значение вызывающего объекта меньше, чем у объекта ОЬ31 — отрицательиое значение. Преимушество интерфейса 1СоврагаЫе<Т> ЗаключаетСя в тоы, что ои обеспечивает типовую безопасность, поскольку в этом случае тип обрабатываемых данных указывается явным образом, а следовательно, никакого приведения типа оь3 ест сравииваемого объекта к нужному типу ие требуется.
В качестве примера ниже приведена программа, в которой демонстрируются сортировка и поиск в массиве объектов определяемого пользователем класса. О Отсортировать масаив объектов и осувеатвить в нем поиск. пв1пч Яуваевт с1авв МуС1авя: 1соирагаЫе<иус1аяя> ( риЫ1с апя аг рпЫьс МуС1авз(апя х) ( 1 = хг ) // Реализовать интерфейс тссирагаЫе<Мус1аяя>. рпЫас апо Соирагето(муС1аяв и) ( гесотп 1 - п.1г ) рпЫтс Ьоо1 Ег]па1я(Мус1азв и) ( геопгп 1 == п.тг ) с1азв Богзпеио [ язао1с по)б Маап() ( МуС1аяя[] опия = пен МуС1аяв[5]г // Отобразить исходный порядок следования.
Сопво1е.игапе("Исходный порядок следования: ")г гогеась(иус1аяя о ап опия) Сопяо1е.иг1пе(о.а + " ")т Сопво1е.нг1веьтпе()Г // Отсортировать массив. Лггау.эогя (пшпя) г // Отобразить порядок следования после сортировки. Сопяо1е.игьее("Порядок следования после сортировки: ") Еогеасп(Мус1авв о ап опия) Сопзо1е.Игаяе(о. 1 + " ")т Сопво1е Игавет апе () г // Найти объект МуС1аяз(2). МуС1авв х = пен МуС1авз(2)г апс абх = Лггау.В1пагузеагсп(поня, х) Сопяо1е.ИгавеЬ1пе("Индекс элемента массива с объектом МуС1аяя(2): тс)х); При выполнении этой программы получается следующий результат: опия[0) гилля [1] гилля [2] пива[Э] поев[4] пеи МуС1авв(5)г пеи МуС1аяв(2)т пеи МуС1аяв(3)т пен МуС1авз(4)т пен МуС1авв(1)т Глава 21.
Пространство имен Зув(еп) 729 730 Часть и, Библиотека СЗ Исходный порядок следования: 5 2 3 4 1 Порядок следования после сортировки: 1 2 3 4 5 Индекс элемента массива с объектом МуС1азз(2): 1 Обращение содержимого массива Иногда оказывается полезно обратить содержимое массива и, в частности, отсортировать по убывающей массив, отсортированный по нарастающей. Для такого обращеиия массива достаточно вызвать метод печегзе () . С его помощью можно обратить содержимое массива полностью или частично. Этот процесс демонстрируется в приведенной ниже программе.
// Обратить содержимое массива. из1пс Яузкещ) с1азз Вечегзепещо ( зкакас чо1б Маап() ( апк(] пчщз = ( 1, 2, 3, 4, 5 )) // Отобразить исходный порядок следования. Сопзо1е.итаке("Исходный порядок следования. "") Гогеась(1пк 1 ап ппщз) Сопзо1е.ит).ке(1 + " ")т Сопзо1е.нг1кеьтпе()' // Обратить весь массив. Лгкау.кечегзе(ппщз)т // Отобразить обратный порядок следования.
сопзо1е.итаке("Обратный порядок следования: ") Гогеась(тпк 1 1п ппщз) Сопзо1е.итаке (1 + " ") > Сопзо1е.ыгкаесапе()т // Обратить часть массива. Лтгау.аечегзе(пчщз, 1, 3); // Отобразить обратный порядок следования. Сопзо1е.ипате("Частично обращенный порядок следования: ") Гогеась(1пк 1 ап ппщз) Сопзо1е.вг1ке(1 + " "); Сопзо1е.вг1ке11пе()) ) ) Эта программа дает следующий результат: Исходный порядок следования: 1 2 3 4 5 Обратный порядок следования: 5 4 3 2 1 Частично обращенный порядок следования: 5 2 3 4 1 Глава 2). пространство имен Зужеа 731 Копирование массива Полное или частичное копирование одного массива в другой — это еще одна весьма распространенная операция с массивами. Для копирования содержимого массива служит метод сору () . В зависимости от его варианта копирование элементов исходного массива осуществляется в начало или в средину целевого массива.
Применение метода Сору () демонстрируется в приведенном ниже примере программы. // Скопировать массив. иягпд зуягекч с1азя Сорупеюо ( ягаггс чо1б мата() 1пг(] яоигсе = ( 1, 2, 3, 4, 5 ); ).пс(] Гагдес = ( 11, 12, 13, 14, 15 )) гпг(] яоигсе2 = ( -1, -2, -3, -4, -5 )т // Отобразить исходный массив. Сопзо1е.нгтсе("Исходный массив: ")) Гогеась(1пс г гп яоигсе) Сопзо1е.нг).се(). ь " ")т Сопзо1е.иггсепгпе()т // Отобразить исходное содержимое целевого массива. Сопяо1е.иггсе("Исходное содержимое целевого массива: ")) Гогеась(тпс г гп Гагдес) Сопяо1е.иггсе(1 + " ")т Сопяо1е .Иггсеьгпе () т // Скопировать весь массив.
Аггау.Сору(яоигсе, Гагдес, яоигсе.ьепдсп) // Отобразить копию. Сопяо1е.иггге("Целевой массив после копирования: ")т Гогеасп(1пс 1 гп Гагдес) Сопяо1е.иггсе(г Ь " ")т Сопяо1е.иг1сеь1пе()) // Скопировать в средину целевого массива. Аггау.Сору(яоигсе2, 2, Гагдес, 3, 2)) // Отобразить копию.
Сопяо1е.нг1се("Целевой массив после частичного копирования: ")~ Гогеасн(гпс г 1п Гагдес) Сопяо1е .Иг1се (1 + " ") т Сопяо1е.иггсецвпе П ! ) Выполнение этой программы дает следующий результат: 732 Часть П, Библиотека Сз Исходный массив: 1 2 3 4 5 Исходное содержимое целевого массива: 11 12 13 14 15 Целевой массив после копирования: 1 2 3 4 5 Целевой массив после частичного копирования: 1 2 3 -3 -4 Применение предиката Предихат представляет собой делегат типа Зуяеещ. Ргес)1сате, возвращающий логическое значение Сгие или Га1яе в зависимости от некоторого условия.
Ои объявляется следующим образом: рив11с ае1ечаке Ьоо1 Ргес)тсяке<т> (т сод) Объект, проверяемый по заданному условию, передается в качестве параметра оЬУ. Если объект оЬ3 удовлетворяет заданному условию, то предикат должен возвратить логическое значение Сгие, в противном случае — логическое значение Га1яе. Предикаты используются в ряде методов класса Актау, включая: ЕхъзСя(), Гъпа(), Гъпд1пдех () и Гз.пс(й11 () . В приведенном ниже примере программы демонстрируется применение предиката с целью определить, содержится ли в целочисленном массиве отрицательное значение. Если такое значение обнаруживается, то данная программа извлекает первое отрицательное значение, найденное в массиве. Для этого в ией используются методы ехъя с я () и Г).пс(() .
// Продемонстрировать применение предикатного делегата. иятпч яуякещ! с1аяя Ргес)пежо ( // Предикатный метод, возвращающий логическое значение // сгие, если значение ч отрицательное. якак1с Ьоо1 1янес(ъпк ч) ( 11(ч < О) гесисп сгие! гекигп Га1яе! ) якакьс чо!.с( Ма(п () ( 1пк() пище = ( 1, 4, -1, 5, -9 )! Сопяо1е.иггке (" Содержимое массива пища: ") ! гогеасп(тпк 1 тп пища) Сопао1е.иг1се(1 + " ")! Сопяо1е.игткеъьпе()! // Сначала проверить, содержит ли массив пища // отрицательное значение.
11(лггау.Ех1якз(пища, Ргес(пежо.1яиед)) Сопяо1е.игткеътпе("Массив пища содержит отрицательное значение."); // Затем найти первое отрицательное значение // в массиве. тпк х = Актау.Гтпа(пища, Ргеипещо.1яиед)! Сопяо1е.игъкеътпе("Первое отрицательное значение: " ь х)! Глава 2(. Пространство имен Зув(ещ 733 е1яе сопяо1е.нг1сеъвпе("В массиве ппщя отсутствуют " ь "отрицательные значения.")т Эта программа дает следующий результат: Содержимое массива пцщя: 1 4 -1 5 -9 Массив пцщв содержит отрицательное значение.