Г. Шилдт - С#4.0 Полное руководство (1160795), страница 197
Текст из файла (страница 197)
вязнем Яуясевг иядпд Буясев.со11есггопя/Яелеггс; В приведенном ниже примере программы демонстрируется применение класса 11п)себ11яс<Т>. 968 Часть П. Библиотека С() с1аяя ОепаьпкедЬгясбеюо ( яяас1с чо1д Ма1п() ( // Создать связный список. ььпкедьаяг<сдаг> 11 = пен ьтп)седь1яг<сьаг>(); сопяо1е.хг1геьлпе("исходное количество элементов в списке: " + 11.социо)," Сопяо1е.иггсеЬ1пе(); Сопяо1е.иг1сеЬ1пе("Добавить в список 5 элементов"); // Добавить элементы в связный список.
11.АсЫЕ1гяг('А')с 11.лддрггяс('В'); 11.лдсрггяг('С'); 11.АсЫГггяс('Р'); 11.Аддр1гяя('Е')С Сопяа1е.ИггсеЬгпе("Количество элементов в списке: " + 11.Сопля)с О Отобразить связный список, обойдя его вручную. ЬьпКедЬ>ясиоде<слаг> поде; Сопяо1е.Иг1ге("Отобразить содержимое списка по ссылкам: ")) гог(поде = 11.Р1гяг; поде )= пц11; поде = поде.иехс) Сопяо1е.иггяе(поде.уа1це + " "); Сопяо1е.иг1сеЬ1пе("1п"); // Отобразить связный список, обойдя его в цикле тогеась.
Сопяо1е.иг1ге("Отобразить содержимое списка в цикле тогеасьс ") тогеась(сьаг сд Ьп 11) Сопяо1е.иг1яе(сь + " "); сопяо1е.иг1сеьтпе("1п")с // Отобразить связньсй список, обойдя его вручную в обратном направлении. Сопяо1е.иг1яе("Следовать по ссылкам в обратном направлении: "); гог(поде = 11.Ьаяя; поде )= пц11; поде = поде.ргечгоця) Сопяо1е.иггбе(поде.уа1це + " "); Сопяо1е.иг1геЬ1пе("1п")с Удалить из списка два элемента. Сопяо1е.иг1яеЬ1пе("Удалить 2 элемента из списка") // Удалить элементы из связного списка.
11.йеюоче('С')) 11.реюоче('А'); Сопяо1е.иг1сеЬ1пе("Количество элементов в списке: " + 11.Соцпс); // Отобразить содержимое видоизмененного списка в цикле согеасл. Глава 26. Коллекции, перечислители и итераторы 969 Сопяо1е.ит1те("Содержимое списка после удаления элементов: "); Готеасв(сват св Тп 11) Сопяо1е.ит1пе(си + " ")( Сопяо1е.итьпеЬЬпе("Хп"); // Добавить три элемента в конец списка. 11.АобЬаяп('Х')1 11.лббьаят('т'); 11.ИЫЬаяп('г'); Сопяо1е.ит1пе("Содержимое списка после ввода элементов: "); тотеасв(сват св ьп 11) Сопяо1е.итьбе(сП т " ")1 Сопяо1е.ит1теьтпе("1п")( ) Ниже приведен результат выполнения этой программы. Исходное количество элементов в списке: О Добавить в список 5 элементов Количество элементов в списке: 5 Отобразить содержимое списка по ссылкам: Е 0 С В А Отобразить содержимое списка в цикле Гохеасв: Е О С В А Следовать по ссылкам в обратном направлении: А В С Р Е удалить 2 элемента из списка Количество элементов в списке: 3 Содержимое списка после удаления элементов: Е Р В Содержимое списка после ввода элементов.
"Е Р В Х т г Самое примечательное в этой программе — это обход списка в прямом и обратном направлении, следуя по ссылкам, предоставляемым свойствами Хехп и Ргеулоця. Двунаправленный характер подобных связных списков имеет особое значение для приложений, управляющих базами данных, где нередко требуется перемещаться по списку в обоих направлениях. Класс Мссуопаху<ТКеу, ТЧа1це> Класс РЬСС1опагу<ТКеу, ТЧа1це> позволяет хранить пары "ключ — значение" в коллекции как в словаре.
Значения доступны в словаре по соответствующим ключам. В этом отношении данный класс аналогичен необобщенному классу наяЬсаЬ1е. В классе РЬСЬ1опагу<ТКеу, ТЧа1це> реализуются интерфейсы 1РЬСС1опату, 1Р1СС1опагу<ТКеу, ТЧа1це>, 1СО11есс1оп, 1СО11есп1оп<КеуЧа1цера1г<ТКеу, ТЧа1це», 1Епцп(егаЬ1е, 1ЕпцтегаЬ1е<КеуЧа1цера1г<ТКеу, ТЧа1це», 1Яег1а11гаЬЬе и 1Реяет1а11гап1опСа11Ьаск.
Вдвухпоследнихинтерфейсахподдерживается сериализация списка. Словари имеют динамический характер, расширяясь по мере необходимости. 970 Часть 11. Библиотека С() В классе Р1стдопагу<ТКеу, ТЧа1ие> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые из них. риЬ11с Рьсгтопагу() риътьс Рьст1ипагу(1Р1сг1опагу<ТКеу, ТЧа1ие> сасстопагу) риътьс Оьсг1опагу (ьпс сарастсу) В первом конструкторе создается пустой словарь с выбираемой по умолчанию первоначальной емкостью. Во втором конструкторе создается словарь с указанным количеством элементов с(успуопагу. А в третьем конструкторе с помощью параметра сара су су указывается емкость коллекции, создаваемой в виде словаря.
Если размер словаря заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера словаря во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. В классе Рдст1опату<ТКеу, ТЧа1ие> определяется также ряд методов. Некоторые наиболее часто используемые методы этого класса сведены в табл. 25.17. Таблица 25.17. Наиболее часто используемые методы, определенные в в(ассе РдсЬдопаку<ТКеу, ТЧа1це> Метод Описание риЬ11с иодс1 ча1ие) дс)с((тКеу )геу, тча1ие добавляет в словарь пару "ключ-значение", определяемую параметрами )геу и иа1ие. Если ключ )геу уже находится в словаре, то его значение не изменяется, и генерируется ис- КЛЮЧЕНИЕ ДтпижепСЕхсерС1оп Возвращает логическое значение сгие, если вызывающий словарь содержит объект )геу в качестве ключа; а иначе — логическое значение Та1яе сопсадпяча1ие (тча1ие Возвращает логическое значение стие, если вызывающий словарь содержит значение иа1ие; в противном случае — логическое значение Та1яе кевоче (ТКеу )геу) Удаляет ключ )геу из словаря.
При удачном исходе операции возвращается логическое значение сгие, а если ключ )геу отсутствует в словаре — логическое значение Та1яе риЬ11с Ьоо1 )сеу) риЬ11с Ьоо1 иа1ие) риЬ11с Ьоо1 Свойство Описание риЬ11с 1Ег(иа11СУСогиратет<ТКеу> Соглратег ( дет; риЬ11с Р1ст1опату<ТКеу, ТЧа1ие>. КеуСо11естдоп Кеуя ( Чегг ) риЬ11с Р1сгуопагу<ТКеу, ТЧа1ие>. Ча1иеСо11естдоп Ча1иея ( оег) Получает метод сравнения для вызывающего словаря Получает коллекцию ключей Получает коллекцию значений Кроме того, в классе Р1сС1опагу<ТКеу, ТЧа1ие> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются.
Эти свойства приведены ниже. Глава 25. Комекции, перечислитеви и игераторы 971 Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Кеуя и Ча1цея. В коллекциях типа Ргссгопагу<ТКеу, ТЧа1це>.КеуСо11ессгопи Ргсс1опагу<ТКеу, ТЧа1це>. Ча1цеСо11есг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це>, например, в цикле Тогеасп перечисляемыми объектами являются пары типа КеуЧа1церагг.
Все ключи в коллекции типа Р1СГ1опагу<ТКеу, ТЧа1це> должны быть уникальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве ключа. В то же время значения не обязательно должны быть уникальными. К тому же объекты не хранятся в коллекции типа Р1СГ1опагу<ТКеу, ТЧа1це> в отсортированном порядке. В приведенном ниже примере демонстрируется применение класса Ргсс1опагу<ТКеу, ТЧа1це>. !/ Продемонстрировать применение класса обобщенной коллекции Рьсс1опагу<ТКеу, Тна1це>. цягпч Буясещ; цягпч Яуясещ.со11ессгопв.оепег1с; с1аяя БеппьсгьапагуОеяю ( ягаггс нояб Магп() ( УУ Создать словарь для хранения имен и фамилий 77 работников и их зарплаты. Ргссгопагу<ясггпч, боцЫе> сьсс = пеи 01сггопагу<ягггпч, боцЫе>()( // Добавить элементы в коллекцию.
б1сс.йбб("Батлер, Джон", 73000); бгсг.дбб(5цварц, Сара", 59000); б1сс.лбб("Пайк, Томас", 45000); бьсс.йбс(("фрэнк, Эд", 99000)7 972 Часть П. Библиотека О№ Получить коллекиию ключей, т.е. фамилий и имен. 1СО11ЕСС1ОП<ВСГГО9> С = б1СГ.КЕУЗГ /! Испольэовать ключи лля получения значений, т.е. зарплаты. Гогеасл(всг1пч эсг гп с) Сопво1е.нг1сеЬьпе("(О), зарплата: (1:С)", всг, бгсс(зсг)); Ниже приведен результат выполнения этой программы. Батлер, Пжон, зарплата: 573,000.00 Шварц, Сара, зарплата: 959,000.00 Пайк, Томас, зарплата: 545,000.00 Фрэнк, Эл, зарплата: 599,000.00 КлассЯокцебРТсЕТопагу<ТКеу, ТЧа1пе> В коллекции класса БогтебР1СС1опагу<ТКеу, ТЧа1ие> пары "ключ-значение" хранятся таким же образом, как и в коллекции класса Р1СС1опагу<ТКеу, ТЧа1ие>, за исключением того, что они отсортированы по соответствующему ключу.
В классе яогтебР1ст1опагу<ТКеу, ТЧа1ие> реализуются интерфейсы 1Р1СС1опагу, 101сс1опагу<ткеу, тча1ие>, 1со11есс1оп, 1со11есс1оп<кеуча1иера1г<ткеу, ТЧа1ие», 1ЕпивегаЬ1е и 1ЕпитегаЬ1е<КеуЧа1иерадг<ТКеу, ТЧа1ие». В классе яогсебР1сс1опагу<ткеу, тча1ие> предоставляются также следующие конструкторы. риЫгс Яогсеб01сггопагу() риыгс яоггебР1сг1опагу(101сг1опагу<ткеу, тча1ие> ббсгхопагу) риЫ1с Боггеб01си1опагу(1союрагег<ткеу> союрагег) риыгс БогсебРгсггопагу(1рьсг1опагу<ткеу, тча1ие> бхсс1опагу, 1Союрагег<ТКеу> соирагег) Таблица 28.18. Наиболее часто используемые методы, определенные в классе ЯогЬебР1СЬ1опагу<ТКеу, ТЧа1ие> Описание Метод Добавляет в словарь пару "ключ-значение", определяемую параметрами )сеу и иа1ие.