Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 177
Текст из файла (страница 177)
// Продемонстрировать применение класса обобщенной // коллекции 01сстопагу<ТК, ТН>. пятна Яуясею; цагин Яуясею.со11есг1опя.оепег1с; с1аяя Сеп01ссгопагуоеюо ( ягасгс чо1п махп() ( // Создать словарь лля хранения имен и фамилий // работников и их зарплаты, цасс1опагу<ясг1пд, боцЫе> бгсс = пен 01сг1опагу<ясг1пд, боцЫе>() // Добавить элементы в коллекцию. б1сг.асЫ("Батлер, Джон", 79000); бгсг.лоб("Шварц, Сара", 59000); 61сс.лоб("Пайк, Томас", 45000)к 01сг.лбе("Фрэнк, Зд", 99000)к // Получить коллекцию ключей, т.е. фамилий и имен. гсо11есс1оп<ясг1пч> с = б1сс.хеуя) // Использовать ключи для получения значений, т.е. зарплаты.
Гогеась(ясг1пч ясг 1п с) Сопао1е.нгггевгпе("(0), зарплата: (1:С)", ясг, 01сс(ясг))к Глава 24. Коллекции, перечнслнтелн н итераторы 881 Ниже приведен результат выполнения этой программы. Батлер, Джон, зарплата: 573,000.00 Шварц, Сара, зарплата: $59,000.00 Пайк, Томас, зарплата: 345,000.00 Фрэнк, Эл, зарплата: 599,000.00 риЫ1с Яоггецвлсгсопагу() Рпысс яогсет)01сссопагу(101сссопагу<тк, тч> сцсс) Рчь11с зогсеп01ссзопагу(1соврагег<тк> совр) риЫ1< Яоггейогсгзопагу(101сгсопагу<ТК, ТЧ> с(зсг, 1Соврагег<ТК> совр) В первом конструкторе создается пустой словарь, во втором конструкторе — словарь с указанным количеством элементов г(Тес. В третьем конструкторе допускается указывать метод сравнения типа 1Соврагег, используемый для сортировки, а в четвертом конструкторе — инициализировать словарь, помимо указания метода сравнения типа 1Соврагег.
В классе Боксе()Р1сс1опагу<тк, тч> определен ряд методов. Некоторые наиболее употребительные методы этого класса сведены в табл. 24.17. Таблица 24.17. Наиболее употребительныеметоды, определениыеа классе Зогсесц)1смопагу<тк, тч> Описание РоЫЕс чогл Ас(г) (ТК )г, ТЧ ч) Добавляет а словарь пару "ключ-значение", определяе- мую параметрами К и в Если ключ к уже находится в словаре, то его значение не изменяется и генерируется ИСКПЮЧЕНИЕ АГЯОВЕПСЕХСЕРС1ОП роЫТс Ьоо1 Сопга1пзКеу(ТК )г) Возвращает логическое значение сгве, если вызываю- щий словарь содержит объект )г в качестве ключа; в про- тивном случае — логическое значение Га1зе риЫТс Ьоо1 Сопгазпзча1че (ТЧ ч) Возвращает логическое значение сгче, если вызываю- щий словарь содержит значение и в противном случае— логическое значение га1зе рвЫ1с Яогге001сгсопагу.
Епшвегагог<ТК, тч> БеСЕпввегагог() Возвращает перечиспитепь для вызывающего словаря риЫ1с Ьоо1 Бевоче(ТК )г) Удапяет ключ )г иэ словаря. При удачном исходе опе- рации возвращается логическое значение с г не, а если ключ )г отсутствует в словаре — логическое значение га1зе Кроме того, в классе Яогге((010СТопагу<ТК, ТЧ> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются.
Эти свойства приведены ниже. Класс'Бок сесШлсслопату<т(у, ТК> В коллекции класса ЯоггеПР1сгуопагу<ТЧ, ТК> пары "ключ — значение" хранятся таким же образом, как и в коллекции класса Р1сс1опагу<тк, тч>, за исключением того, что они отсортированы по соответствующему ключу. В классе яогсес(Р1011опагу<тч, тк> реализуются интерфейсы 1Р1ссьопагу,101сс1опагу<тк, ТЧ>, 1С011есС1оп, 1С011есг1оп<КеуЧа1пеРалг<ТК, ТЧ», 1ЕпцвегаЬ1е и ХЕпцвегаЫе<КеуЧа1цеРа1г<ТК, ТЧ». В классе яогСе((Р1001опагу<ТЧ, ТК> предоставляются также следующие конструкторы: 882 Часть П. Библиотека С№ Свойство Описание рцЫ1с аг<ТК> Соврагег ( чег; ) рцы1с Боггебргсг1опагу<тк, тч>. КеуСо11есггоп Кеуя ( четы ) Получает метод сравнения дпя вызывающего словаря Получает коллекцию ключей рцЫ1с Боггебр1сстопагу<ТК, ТЧ>. Ча1цеСо11есс1оп Ча1цея ( дес; ) Получает коллекцию значений Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Кеуя и Ча1цея.
В коллекциях типа БоггебРТссйопагу<ТК, ТЧ>.кеуСо11есс1оп и БогсебР1сгй-пагу<ТК, ТЧ>. Ча1цеСо11ессйоп реализуются как обобщенные, так и необобщенные формы интерфейсов 1Со11есс№оп и 1ЕпцвегаЫе. И наконец, в классе БогсебР1ссйопагу<тк, тч> реализуется приведенный ниже индексатор, определенный в интерфейсе 1Р1ссйопагу<ТК, ТЧ>. рцьзгс тч сыз(тк кеу) ( Бось вес; ) рцЫ1с тК Кеу) рцЬ11с ТЧ Ча1цеп В этих полях содержится ключ или значение соответствующего элемента коллекции. Как правило, структура кеуча1церайг<ТК, ТЧ> не используется непосредственно, поскольку средства класса БогсебР1сг№опагу<тк, тч> позволяют работать с ключами и значениями по отдельности. Но при перечислении коллекции типа БогсебР№сс№опагу<тк, тч>, например в цикле Тогеас)т, перечисляемыми объектами являются пары типа КеуЧа1цеРа1г.
Все ключи в коллекции типа БогсебР1сс№опагу<тк, тч> должны быть уникальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве ключа. В то же время значения не обязательно должны быть уникальными. В приведенном ниже примере демонстрируется применение класса БоггебР№сс1опагу<ТК, ТЧ>. Это переделанный вариант предыдущего примера, демонстрировавшего применение класса Р1сс1опагу<тк, Тч>. В данном варианте база данных работников отсортирована по фамилии и имени работника, которые служат в качестве ключа. // Продемонстрировать применение класса обобщенной // коллекции Богсебввсс1опагу<тк, тч>. цв1пд Буягевп ця1пе Буягев.со11есс1опя.пепег1с) с1аяя Пепзогсебв№сгтопагупево ( ясагтс чоьй Мвтп() ( // Создать словарь для хранения имен и Фамилий // работников и их зарплаты. Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента.
Однако в данном случае в качестве индекса служит ключ элемента, а не собственно индекс. При перечислении коллекции типа БоггебР1сс1опагу<ТК, ТЧ> из нее возвращаются пары "ключ — значение" в форме структуры КеуЧа1пера№г<ТК, ТЧ>. Напомним, что в этой структуре определяются два поля: Глава 24. Коллекции, перечислители и итератары 883 Яогсеб01ссаопагу<яггапч, боцЫе> басс = пен Яогтебпассаопагу<яггапч, боцЫе> () // Добавить элементы в коллекцию. баса. Кбб("Батлер, Джон", 73000) т б1сс.абб("Шварц, Сара", 59000)т б1сс.лбб("Пайк, Томас", 45000)т басс.лбб("Фрэнк, Эд", 99000)т // Получить коллекцию ключей, т.е.
Фамилий и имен. 1Со11есггоп<ясг1пч> с = б1сГ.Кеуят // Использовать ключи для получения значений, т.е. зарплаты. Хогеаси(ягг1пч якг 1п с) Сопяо1е.вг1те1.ьпе("(О), зарплата: (1:С)", ягг, б1сс(ясг))т Эта программа дает следующий результат: Батлер, Джон, зарплата: 573,000.00 Пайк, Томас, зарплата: 545,000.00 Фрэнк, Зд, зарплата: $99,000.00 Шварц, Сара, зарплата: 559,000.00 Как видите, список работников и их зарплаты отсортировав по ключу, в качестве которого в данном случае служит фамилия и имя работника. Класс Зол йесидяй<тК, тЧ> В кодлекции класса Яогсеб11яс<ТК, ТЧ> хранится отсортированный список пар "ключ — значение".
Это обобщенный эквивалент класса иеобобщеииой коллекции Боггебпаяг. В классе Боггеб11яг<тк, тч> реализуются интерфейсы 1РТсгбопагу, 1РТсс1опагу<ТК, ТЧ>, 1СФ11есс1оп, 1Со11ессаоп< КеуЧа1церааг<ТК, ТЧ», 1БпцтегаЬ1е и 1БпцюегаЬ1е< Кеуча1церааг<ТК, ТЧ». Размер коллекции типа Боггеб11яг<тк, тч> изменяется динамически, автоматически увеличиваясь по мере необходимости. класс Яогйебпаяг<тк, тч> подобен классу ЯоггебР1сг1опагу<тк, ТЧ>, ио у него другие рабочие характеристики.
В частности, класс Яогсеб11яс<ТК, ТЧ> использует меньше памяти, тогда как класс яоггебР1сгаопагу<тк, тч> позволяет быстрее вставлять неупорядоченные элементы в коллекцию. В классе Богсеб11ЯГ<ТК, ТЧ> предоставляется немало конструкторов. Ниже перечислеиы наиболее употребительные конструкторы этого класса. рцЫгс Богсебьаяг() рцы1с яоггебваяс(101сгаопагу<тк, тч> ббсс) рцЫ1с Яогтебваяг(1пс емкость) рцы1с яоггебт аяг(1союрагег<тк> совр) В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов бб с С. В третьей форме конструктора указывается емкость коллекции, создаваемой в виде отсортированного списка.
Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополиитель- 884 Часть П. Бкблкотека С№ ных затрат вычислительных ресурсов. И в четвертой форме конструктора допускается указывать метод для сравнения объектов, содержащихся в списке. Емкость коллекции типа еоггег)е1эт<тк, ТЧ> увеличивается автоматически по мере необходимости, когда в список добавляются новые элементы. Если текущая емкость коллекции превышается, то она увеличивается. Преимущество указания емкости коллекции типа Багге<)Е1эс<тк, ТЧ> при ее создании заключается в снижении или полном исключении издержек на изменение размера коллекции.
Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если заранее известно, сколько элементов требуется хранить в ней. В классе Богсес1Етэс<ТК, ТЧ> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее употребительных методов этого класса перечислены в табл. 24.18. Следует иметь в ви)п, что пере- числитель, возвращаемый методом Сегеповегагог (), служит для перечисления пар "ключ— значение", хранящихся в отсортированном списке в виде объектов типа КеуЧа1церагг. Таблица 24.18.