Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 176
Текст из файла (страница 176)
Наиболее употребительные методы, определенные в классе Ь1п3сес)Ь1в К<Т> Описание РиЫгс Ь1пКеоь1ясиоие<Т> Аг)иаусег(ЬЬпкег)пзясиог)е<т> л, т и) Добавляет в список узел со значением и непосредствен- но посла указанного узла и. Указываемый узел и не должен быть пустым (пи11). Метод возвращает ссылку на узел, содержащий значение и риЫ1с иове Аиг)АТГег(ъзпкеиъзясиоие<т> и, ЬзпКеОЬЬясиоие<Т> пем) Добавляет в список узел пем непосредственно после указанного узла и. Указываемый узел и не должен быть пустым (пи1Ц.
Если узел и отсутствует в списке или если узел нем является частью другого списка, то генерируется исключение 1пча1гоорегагзопехсерггоп В первом конструкторе создается пустой связный список, а во втором конструкторе— список, ииициализируемый элементами из коллекции с. Как и в большинстве других реализаций связных списков, в классе Е1пке<)вйэс<Т> инкапсулируются значения, хранящиеся в узлах списка, где находятся также ссылки на предыдущие и последующие элементы списка.
Эти узлы представляют собой объекты класса Ь1пхеоЬ1яеио<)е<Т>. В классе Ь1п хе<(вйясиог(е<Т> предоставляются четыре свойства: 876 Часть (!. Библиотека СЗ Окончание табл. 2д )5 Описание РОЫТС Етпкебптяк<Т> Аббттгят( Т ч) роЫТс 11пкеб11ят<т> Аббьаят( т т) риЫ1с 11пхеб11як<т> Еапбьаяк(т ) роЬ11о Ьоо1 яевоче(Т щ роЫ1с чокб яевочег1тят() роЫТс чо1б Яевочеьаят() // Продемонстрировать применение класса 11пхеб11ят<т>. ия1пс Эуякев; оя1по яуясев.со11есс1опя.сепет1сг с1аяя Оепдапхебстякрево ( якат1с ча1б Ма1п() // Соялать связный список. етпкебьтяс<сьат> 11 = печ етпкеб11яс<сьаг> О риЫтс Ь1пнеб11якиобе<т> Аббвеботе(рапхебптятиобе<Т> и, Т ч) ротс чоьб Аббвеботе(11пхеб11ятиобе<т> и, Етпхеб11ятиобе<т> пен) роЫтс чо1б Аббт1гяк (11пхебь1ятиобе пен) роЫТс но1б Абооаят (Ьтпхеб11ятиобе лен) риЫтс Еапхебпзяс<Т> Гтпб(Т т) рнЫТс чо1б Яеваче(11пхеб11ят<Т> и) В приведенном ниже примере 11п)тебЕ1як<т>.
Добавляет в список узел со значением ч непосредствен- но перед указанным узлом и. Указываемый узел и не должен быть пустым (пи11). Метод возвращает ссылку на узел, содержащий значение т Добавляет в список узел лен непосредственно передуказанным узлом и. Указываемый узел и не должен быть пустым (пи1Ц. Если узел и от- сугствует в списке или если узел лен является ча- стью другого списка, то генерируется исключение Тпна11борегатзопЕхсерт1оп Добавляет узел со значением ч в начало списка. Метод возвращает ссылку на узел, содержащий значение ч Добавляет узел пене начало списка, Если узел пеняв- ляется частью другого списка, то генерируется исключе- ние Хпча1кборегас1опехсерс1оп Добавляет узел со значением ч в конец списка.
Метод возвращает ссылку нв узел, содержащий значение ч Добавляет узел лен в конец списка. Если узел лен яв- ляется частью другого списка, то генерируется искпюче- ннв 1пча11бсрегаттопЕхсерттоп Возвращает ссылку на первый узел в списке, имеющий значение в Если искомое значение ч отсутствует в спи- ске, то возвращается пустое значение Возвращает ссылку на последний узел в списке, имею- щий значение «.
Если искомое значение т отсутствует в списке, то возвращается пустое значение Удаляет из списка первый узел, содержащий значение в Возвращает логическое значение с где, если узел удален, т.е. если узел со значением ч обнаружен в списке и удален, в противном случае возвращает логическое значение ба1яе Удаляет из списка узел, соответствующий указанному узлу и. Если узел и отсутствует в списке, то генерирует- ся исключение тпча11борегас1опехсерс1оп Удаляет из списка первый узел Удаляет из списка последний узел программы демонстрируется применение класса Глава 24.
Коллекции, перечисли(ели и итераторы 877 сопяо1е.йгггеьапе("Исходное количество элементов " ч "в списке: " + 11.Соцпс)т Сопяо1е.йг1кевтпе() Сопяо1е.йггсетапе("Добавить в список 5 элементов"); // Добавить элементы в связный список. 11ЛСс(Г1гяк ('Л' ) т 11.ас(ПГ1гяк('В')) 11.аббГ).гяс('С')т 11 Лс)с(Г1гяк (' О') т 11.асЫГ1гяс('Е'): Сопяо1е.йг1ге11пе("Количество элементов " + "в списке: " + 11.Соцпг)т // Отобразить связный список, обойдя его вручную. 11пкеЖ1ясйобе<снаг> посек сопяо1е.йггге("Отобразить содержимое списка по ссылкам: "] гог(пес(е = 11.Г1гякт попе != пц11) поде = пос(е.йенс) сопяо1е.йг1ге(пес(е.на1це + " ")т Сопяо1е.йг1ке11пе("чп")т // Отобразить связный список, обойдя его в цикле Гогеасл.
Сопяо1е.йг1ге( "Отобразить содержимое списка в цикле аогеаслт "); гогеасн(сваг сн гп 11) Сопяо1е.йг).ке (сн + " ") т Сопяо1е .Иг1сеькпе (" тп") т // Отобразить связньва список, обойдя его вручную // в обратном направлении. Сопяо1е.йг1се( "Следовать по ссылкам в обратном направлении: ")т гог(пос(е = 11.1аяс) пос(е !" пц11; поде = пос(е.Рген1оця) сопяо1е.йг1ге(пес(е.на1це + " ")т Сопяо1е .Иггке11пе (" тп") ) // Удалить иэ списка два элемента. Сопяо1е.йг1ке11пе("Удалить 2 элемента из списка") // Удалить элементы из связного списка. 11.аеюоне('С'); 11.Вазоне('Ь')т Сопяо1е.йг1ге11пе("Количество элементов " ч "в списке: " + 11.Соцпк)т // Отобразить содержимое видоизмененного списка в цикле гогеасн.
878 Часть П. Библиотека С() Сопво1е.иг1ге("Содержимое списка после удаления элементов: ")т гогеасЬ(сваг сЬ кп 11) Сопво1е.игьге(сь + " ")т сопво1е.иг1сеь1пе("кп")т О Добавить три элемента в конец списка. 11.АсЫЬавс('Х')) 11.АкЫЬавг('т')т 11.АсЫ(,авс('Е')т Сопво1е.нг1се("Содержимое списка после ввода элементов: ")т Гогеасп(сьаг сь Ьп 11) Сопво1е.нгьге(со + " ") т сопво1е.игтсеьапе ("кп") т Ниже приведен результат выполнения этой программы. Исходное количество элементов в списке: О Добавить в список 5 элементов Количество элементов в списке: 5 Отобразить содержимое списка по ссылкам: Е О С В А Отобразить содержимое списка в цикле Гогеастм Е'О С В А Следовать по ссылкам в обратном направлении: А В С О Е Удалить 2 элемента иэ списка Количество элементов в списке: 3 Содержиьюе списка после удаления элементов: Е О В Содержимое списка после ввода элементов: Е О В Х т 2 Самое примечательное в этой программе — это обход списка в прямом и обратном направлении, следуя по ссылкам, предоставляемым свойствами Мехе и Ргеч1оцэ.
Двунаправленный характер подобных связных списков имеет особое значение для приложений, управляющих базами данных, где нередко требуется перемещаться по списку в обоих направлениях. Класс Шсйхопату<Т~, й'~У) В классе О1сС1опагу<ТК, ТЧ> пары "ключ — значение" хранятся в коллекции как в словаре. Значения доступны в словаре по соответствующим ключам. В этом отношении данный класс аналогичен необобщенному классу НаэпгаЫе. В классе О1се1опагу<ТК, ТЧ> реализуются интерфейсы 1ОЬсСЬопагу, 1О1с11опагу<ТЧ, ТЧ>, 1Со11есг1оп, 1Со11есг1оп<КеуЧа1цеРа1г<ТК, ТЧ», 1ЕпцатегаЫе, 1ЕпциегаЫе<КеуЧа1цеРа1г<ТК, ТЧ», 15ег1а11гаЫе и 1пеэег1а11гае1опСа11Ьасх.
В двух последних интерфейсах поддерживается сериализация списка Словари имеют динамический характер, расширяясь по мере необходимости. Глава 24. Коллекции, леречислители н нтераторы 879 В классе Р1ссгопагу<ТК, ТЧ> предоставляется немало конструкторов. Ниже перечислены наиболее употребительные из них. рцЫгс О1ссгопагу() рпЫго Огссгопагу (1О1ссгопагу<ТК, ТЧ> <(1сс) риЫ1с О1сс1опагу (1пс емкость) Таблица 24.
т 6. Наиболее употребительные методы, определенные в классе Р1сИопагу<ТК, ТЧ> Описание Метод рць11 гн ЛСС(ТК )г, тч ) Добавляет в словарь пару "ключ-значение", определяеыую параметрами )г и ч. Если ключ )г уже находится в словаре, то его значение не изменяется и генерируется исключение АгопаепГЕхсерсгоп Возвращает логическое значение ггпе, если вызывающий словарь содервит объект )г в качестве ключа; в противном случае — логическое значение та1зе Возвращает логическое значение ггое, если вызывающий словарь содервит значение Ю в противном случае — логическое значение га1зе тч> Возвращает перечислительдля вызывающего словаря Удаляет ключ )( из словаря.
При удачном исходе операции возвращается логическое значение ггпе, а если ключ )г отсутствует в словаре — логическое значение Га1зе роЫ1с Ьоо1 Сопса1пвКеу(ТК )г) рагс Ьоо1 СопсагпзЧа1ие(ТЧ ч) риЫ1с 101сс1опагу.кпциегасог<ТК, СеГЕпапегасог() рпЫ1с Ьоо1 Веиоче(ТК )г) роме того, в классе О1сс1опагу<ТК, ТЧ> определяются со твенные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже. Свойство Описание риЬ1гс 1ЕЧпа11сусотрагег<ТК> Соарагег ( Чесг ) риыгс Огсг1опагу<тк, тч>. КеуСо11ессгоп Кеуз ( дес) риьЦс Огсг1опагу<тк, тч>. Ча1иесо11есс1оп Ча1иез ( Сепг Получает метгщ сравнения для вызывающего словаря Получает коллекцию ключей Получает коллекцию значений ) Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Кеуз и Ча1цез. В коллекциях типа О1ОС1опагу<ТК, ТЧ>.КеуСо11ессгоп и Р1сС1опагу<ТК, ТЧ>.Ча1цеСО11есс1оп реализуются как обобщенные, так и необобщенные формы интерфейсов 1Со11есг1оп и ТЕпцвегаЫе, В первом конструкторе создается пустой словарь с выбираемой по умолчанию первоначальной емкостью.
Во втором конструкторе создается словарь с указанным количеством элементов п1сс. А в третьем конструкторе указывается емкость коллекции, создаваемой в виде словаря. Если размер словаря заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера словаря во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. ' В классе Русс1опагу<ТК, ТЧ> определяется также ряд методов.
Некоторые наиболее употребительные методы этого класса сведены в табл. 24.16. 880 Часть П, Библиотека СЗ И наконец, в классе 01сс1опагу<тк, тч> реализуется приведенный ниже индексатор, определенный в интерфейсе 101сг1опагу<ТК, ТЧ>. рцЫ1с ТЧ ГЫя(ТК Леу] ( четы яЕГт ) Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Однако в качестве индекса в данном случае служит ключ элемента, а не собственно индекс. При перечислении коллекции типа 01СС1опагу<ТК, тЧ> из нее возвращаются пары "ключ — значение" в форме структуры кеуЧа1цера1г<тк, тЧ>. Напомним, что в этой структуре определяются два поля: рцЫТс ТК Кеу; рцЫгс ТЧ Ча1цет В этих полях содержится ключ или значение соответствующего элемента коллекции.
Как правило, структура КеуЧа1цера1г<ТК, ТЧ> не используется непосредственно, поскольку средства класса 01011опагу<тк, тч> позволяют работать с ключами и значениями по отдельности. Но при перечислении коллекции типа 01сг1опагу<ТК, ТЧ>, например, в цикле Тогеас)т перечисляемыми объектами являются пары типа КеуЧа1церагг. Все ключи в коллекции типа ()1СС1опагу<ТК, ТЧ> должны быть уникальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве ключа. В то же время значения не обязательно должны быть уникальными. К тому же объекты не хранятся в коллекции типа 01СС1опагу<ТК, ТЧ> в отсортированном порядке. В приведенном ниже примере демонстрируется применение класса 01сс1опагу<ТК, ТЧ>.