Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 179
Текст из файла (страница 179)
А если методы Оес(иене () и РееК () вызываются, когда очередь пуста, то генерируется исключение 1пча11с)Орегаа1опЕхсерк1оп. Таблица 24.20. Методы, определенные в классе Омепе<т> Описание Метод риЫьс Т Оециеие() риЬ11с чога Епяиеие (Т ч) риЬ11с Т РееК() Добавляет объект ч в конец очереди риЫьс чьггиа1 Т() Токггау() риЫьс чога Тгьвкхсеяя() В приведенном ниже примере демонстрируется применение класса Оиеие<Т>. // Продемонстрировать применение класса Яиеие<Т>. ияьпд эуягев; ия1пч зуясев.со11есс1опя.бепегьсг с1аяя Оепоиеиеоево ( ягас1с чога Маго О ( Сиене<с)оиЫе> ч = пен Сиене<с(оиЫе>() с)оиЬ1е яив = 0.0; Сопяо1е.нгьсе("Очередь содержнтс "); нЫ1е(Ч.Соипс > О) ( с(оиЬ1е ча1 = ч.речиеие()г Сопяо1е.нг).се(ча1 + " "); яив ь= ча1; Сопяо1е.нгтсеь1пе("кпитогояая суьвса равна " 4 яив); ) Вот к какому результату приводит выполнение этой программы: Очередь содержит: 98.6 212 32 3.1416 Итоговая сумма равна 345.7416 Ч.Епциеие(98.6); Ч.Епяиеие(212.0]; Ч.Епяиеие(32.0); с(.Епс(иене(3.1416); Возвращает объект из начала вызывающей очереди.
Возвращаемый объект удаляется иэ очереди Возвращает объект из начала вызывающей очереди, но не удаляет его Возвращает массив, который содержит копии элементов из вызывающей очереди Сокращает избыточную емкость вызывающей коллекции е виде очереди Глава 24. Коллекции, перечаспители к итераторы 8В9 Класс налЬВе с<2> Класс назьяес<т> был внедрен как новый класс коллекции в версии 3.5 среды .)ч)ЕТ Ргашекуог)(. В ием поддерживается коллекция, реализующая множество.
Для хранения элементов этого множества используется хеш-таблица. В классе назьЯеь<т> реализуются интерфейсы 1Со11есгтоп<Т>, 1ЕппвегаЬ1е, 1Еппвегалте<т>, 1яег1а11хаЬ1е и 1))езег1а11гаыопса11ьас)к. В коллекции типа наэьЯеь<т> реализуется множество, в котором все элементы являются уникальными. Иными словами, дубликаты в таком множестве ие допускаются.
Порядок следования элементов в множества не указывается. В классе назЬЯес<т> определяется полный набор операций с множеством, включая пересечение, объединение и разноименность. Благодаря этому класс Назпзес<т> идеально подходит для работы с множествами объектов. Коллекция типа Наэизег<т> имеет динамический характер и расширяется по мере необходимости, чтобы вместить все элементы, которые должны в ией храниться.
Ниже перечислены наиболее употребительные конструкторы, определенные в классе Наэпзег<т>. риЬ11с Наппзек() рпЫ1с Наппяес(1ЕпивегаЫе<т> с) рпЫТс Наппзеп(1ЕЧпа11куСовраге совр) рпЫкс Наппяес(1ЕпивекаЫе<т> с, 1ЕЧпа11Кусовраге совр) Таблица 24.21. Методы операций с аеНОжвстаОы, ОпрЕдЕлвнные а клаССе НавЬВес<Т> Описание рпЫгс чо1О Ехсерснгсп (1епивегаЫе<Т> эег2) Удаляет из вызывающего множества элементы, указы- ваемые в множестве пас2 Удаляет из вызывающего множества те элементы, кото- рье не являются общими дпя вызывающего множества и множества эесг рагс по1к) 1пкекэескхгкь (Хеппвегаь1е<т> зес2) риЫ1с Ьоо1 1пргорегяпьпеког(1еппвекаые<т> еег2) Возвращает логическое значение ккие, если вызываю- щее множесво является правильным подмножеством множества пеС2 В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции с.
В третьей форме конструктора допускается указывать метод сравнения. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции с, и используется заданный метод сравнения совр. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество упорядоченными последовательно данными. В классе Наэизес<т> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются.
В большинстве этих методов поддерживаются различные операции с множеством. Методы операций с множеством, определенные в классе НазЬЯес<т>, сведены в табл. 24.21. Следует также иметь в виду, что аргументы этих методов относятся к типу 1ЕппвегаЫе<Т>. Это означает, что в качестве аргумента, определяющего множество, этим методам можно передавать и другие объекты, а не только еще одну коллекцию типа НазЬЯес<т>. Но чаШе всего оба операнда тех операций, которые выполняются над множеством, оказываются экземплярами объектов типа НаэЬЯес<Т>.
890 Часть Н. Библиотека С№ Оконемиз мбл. 2№2( риЫгс Ьоо1 1зргорегзирегзегст(15пивегзЫе<Т> зас2) риЬ11с Ьоо1 1зяиьзеСОГ(1епивегаЫе<Т> зег2) риЫТс Ьоо1 Возвращает логическое значение сгие, если вызываю- 1ззирегзеСОГ (1епивегаЫе<Т> зег2) щее множество является надмножаством множества зес2 риЬ11с Ьоо1 Бесес(иа1з пепвлегаЫе<т> зес2) риЫтс чолн яупмесг1сехсерси1сьпегпзвегаЬ1е<т> лег 2) риЫьс чола Пптопиьгп (1ЕпивегаЫе<Т> зег2) Помимо свойств, определенных в интерфейсе 1со11есс1оп<т>, в класс назьБес<т> введено дополнительное свойство Соврагег, приведенное ниже. риЬ11с 1ечиз11сусоврзгег<т> соврагег ( цес) ) Омо позволяет получать метод сравнения для вызывающего хеш-множества. Ниже приведем конкретный пример применения класса НазЬЯеС<Т>.
/г' Продемонстрировать применение класса Назпяег<Т>. изхпс Бузгев) ильин Бузгев.ео11есг1опз.сепег1с) с1азз НазЬЯегрево ( зсасьс чогб Бьон(зсгтпо взо, нззьЯес<сьаг> зес) ( зсасьс чолн матп() ( назьяес<сьаг> зесА пен назьяес<сьаг>() назьяес<сьзг> зесВ = пен нззьяес<сьаг>() Сопзо1е.нгаге(взч) Гогезсп(спас сЬ Тп Сопзо1е.нгтге(сЬ Сопзо1е.нг1геЬТпе( зеСА.Ас(с(('А')) зеСА.АсЫ ('В'); зеСА.АПП('С')) зес) ): Возвращает логическое значение сгие, если вызываю- щее множество является правильным надмножеством множества ее с 2 Возвращает логическое значение сгие, если вызываю- щее множество является подмножеством множества зег2 Возвращает логическое значение сгие, если вызываю- щее множество равнозначно множеству зе с 2 Изменяет вьаываклцее мнакество таким образом, что- бы оно состояло из всех элементов как самого вызываю- щего множества, так и множества зе с 2, кроме тех эле- ментов, которые являются общими для обоих множеств.
Это так называемая разноименность двух множеств Добавляет в вызывающее множество апементы иэ мно- жества зес2, исключая дубликаты. В итоге образуется обьединение двух множеств Глава 24. Коллекции, перечислители и итераторы 891 яеСВ.Або('С')) яесВ.А И('П') ) яеСВ.А И('Е') ) Бпон("Исходное содержимое множества яесат ", зеТА) 5Ьои("Исходное содержимое множества яесВ: ", яесВ) зесА.БупвекгхсЕхсерсихсЬ(яеСВ); Япон("Содержимое множества зесА после " ъ "раэноименности со множеством БесВ: ", зеСА)т зеСА.Пп1опнхсп(зесВ); БЬон("Содержимое множества яесА после " + "объединения со множеством ЯесВ: ", веТА) яеСА.ЕхсерснъСЬ(зеСВ)) ЯЬои("Содержимое множества веСА после " ъ "вычитания иэ множества зесв: ", веса) Сопзо1е.нсъсеъъпе() Ниже приведен результат выполнения программы из данного примера. Исходное содержимое множества веСА: А В С Исходное содержимое множества зесВ: С О Е Содержимое множества веТА после раэноименности со множеством ЯесВ: А В О Е Содержимое множества зесА после объединения со множеством 5есВ: А В 0 Е С Содержимое множества веСА после вычитания иэ множества яеСВ: А В Сохранение объектов определяемых пользователем классов в коллекции Ради простоты приведенных выше примеров в коллекции, как правило, сохранялись объекты встроенных типов, в том числе 1пс, ясг1по и спаг.
Но ведь в коллекции можно хранить не только объекты встроенных типов. Достоинство коллекций в том и состоит, что в них допускается хранить объекты любого типа, включая объекты определяемых пользователем классов. Рассмотрим сначала простой пример применения класса необобщенной коллекции Аггау11эс для хранения информации о товарных запасах. В этом классе инкапсулируется класс 1пчепсогу. // Простой пример коллекции товарных запасов. ) сяъпд ЯуяСелы цяъпч ЯуяСев.Со11ессуопят с1азз 1пчепкогу ( яСгупч паве; боцЬ1е созот ъпс оппапбт о92 Часть П. Библиотека Са рцЫгс 1пчепгогу(згггпч и, боцЫе с, гпг П) ( пате = пт созг = ст опьапб Ы ) рцЫгс очегг1бе зггьпч Тозгггпч() ( гегцгп Эгг1пч.уогиаг("(0,-10)Стоимосты (1,6:С) Наличие: (2)", паве, созг, оппапб)т ) ) с1азз 1пчепгогуггзг ( згаггс чогб магп() ( Аггауь1зг гпч = пен йггауььзг() // дооавить элементы в список. 1пч.асс(пеи 1пчепгогу("Кусачки", 5.95, 3))) 1пч.лоб(пеи 1пчепгогу("Отвертки", 8.29, 2))) 1пч.лбк((пеи 1пчепгогу("Молотки", 3.50, 4))т 1пч.хсЫ (пеи 1пчепгогу("дрели", 19.88, 8))) Сопзо1е.кг1геь1пе("Перечень товарных запасов:"); Гогеасъ(1пчепгогу г гп гпч) ( Сопзо1е.вг1гевапе(" " + г)т ) ) При выполнении программы из данного примера получается следующий результат: Перечень товарных запасов: Кусачки Стоимосты $5.95 Отвертки Стоиыостьы $8.29 Молотки Стоимость: $3.50 Дрели Стоимость: $19.88 Наличие: 3 Наличие: 2 Наличие: 4 Наличие: 8 // Пример сохранения объектов класса 1пчепгогу в // обобшенной коллекции класса ь1зг<т>.
Обратите внимание на то, что в данном примере программы не потребовалось никаких специальных действий для сохранения в коллекции объектов типа 1пчепгогу. Благодаря тому что все типы наследуют от класса о)>3 есг, в необобщеииой коллекции можно хранить объекты любого типа. Именно поэтому в необобщеиной коллекции нетрудно сохранить объекты определяемых пользователем классов. Безусловно, это также означает, что такая коллекция не типизирована.