Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 173
Текст из файла (страница 173)
В приведенном ниже конструкторе можно указать не только размер коллекции, но и первоначальное значение составляющих ее битов. 864 Часть П. Библиотека С№ Свойство ВепоСЬ позволяет установить или получить количество битов в коллекции. Следовательно, оно возвращает такое же значение, как и стандартное свойство Соцпс, определяемое для всех коллекций. В отличие от свойства Соцпг свойство ВепоСЬ доступно не только для чтения, но и для записи, а значит, с его помощью можно изменить размер коллекции типа В1САггау. Так, при сокращении коллекции типа В№сдггау лишние биты усекаются, начиная со старшего разряда.
А при расширении коллекции типа Вггдггау дополнительные биты, имеющие логическое значение Та1яе, вводятся в коллекцию, начиная с того же старшего разряда. Кроме тото, в классе В1САггау определяется следующий индексатор: рцвттс Ьоо1 Спгв [Тпг Тпх] ( арест вест ) С помощью этого индексатора можно получать или устанавливать значение элемента. В приведенном ниже примере демонстрируется применение класса В1САггау. // Продемонстрировать применение класса ВТСАггау. плыло зувСеет цяьпд зуягеи.Со11есС1опят с1авя ВАОеио ( рцЬ11с вгаСТс чоьд 5понвкгв(всг1пд геи, В1САггау ЬТСв) ( Сопяо1е.нг1СеЬгпе(геи)т Гог(глг 1=07 1 < Ь1ся.СОцПС; 1+Ь) Сопяо1е.игасе("[О, -б) ", Ь|гв(г])т Сопяо1е. ХС1ге11пе (" 1п" ) ) вгаггс чоьд Ма1п() ( 81САггау Ьа = пен ВТСАггау(8)т Ьусе[] Ь = ( бт )т Втгкггау Ьа2 = пеи 51САггау(Ь)т зпонВ1гя("Исходное содержимое коллекции Ьа:", Ьа)т Ьа Ьа.иог () т 5ЬонВТСв("Содержимое коллекции Ьа " + "после логической операции НОТ:", Ьа)т 5пои81гя("Содержимое коллекции Ьа2:", Ьа2)т 81САггау Ьаз = Ьа.Хог(Ьа2)т зпонВТСв("Результат логической операции Ьа Хок Ьа2:", Ьаз)т ) Эта программа дает следующий результат: Исходное содержимое коллекции Ьа: Га1ве Га1яе Га1ве Га1ве Га1яе Га1ве Га1яе Га1яе Содержимое коллекции Ьа после логической операции НОТ: Тгце Тгце Тгце Тгце Тгце Тгце Тгце Тгце Глава 24.
Коллекции, перечислнтели н нтераторн 865 Содержимое коллекции Ьа2". тгце тгце Ра1ве Ра1ве Ра1яе Га1ве тгце Ра1ве Результат логической операции Ьа ХОП Ьа2: Ра1яе Ра1яе тгие тгце тгие тгие Ра1ве тгце Специальные коллекции В среде .НЕТ Ргашешогк предусмотрен ряд специальных коллекций, оптимизированных для работы с данными конкретного типа или для их обработки особым образом. Классы этих необобщенных коллекций определены в пространстве имен Яувгею. СО11есС1опв.Яресга1ггетГ и перечислены ниже.
Класс специальной коллекции Описание Со11ест1опяпт11 Нуьг1ОО1ст1опагу Содержит фабричные методы для создания коллекций Предназначен для коллекций, в которых для хранения не- большого количества пар "ключ-значение" используется класс ЬавГОгссгопагУ.
При превышении коллекцией определенного размера для хранения в ней элементов автоматически использу- ется класс наяьгаьте 11ятс1сс1опагу Предназначен для коллекций, в которых для хранения пар "ключ-значение" используется связный список. Такие коллекции рекомендуются только для хранения небольшого количества эле- ментов Наиеуа1цесо11есс1оп Предназначен для отсортированных коллекций, в которых хранят- ся пары "ключ-значение", причем и ключ, и значение относятся к типу вгг1по Предназначен для коллекций, в которых хранятся индексируемые пары "ключ-значение" Предназначен для коллекций, оптимизированных для хранения символьных строк Предназначен для хеш-таблиц, в которых хранятся пары "ключ- значение", причем и ключ, и значение относятся к типу ягг1пд Огпегепр1сттопагу Ягг1пчсо11есг1оп ятг1пдртсс1опагу Кроме того, в пространстве имен Яуягеш.
СО11ест1опя определены три базовых абстрактных класса: СО11ест1опВаве, ВеабОп1уСО11есС1опВаяе и 01СС1опагуВаяе. Эти классы могут наследоваться и служить в качестве отправной точки для разработки собственных специальных коллекций. Обобщенные коллекции Благодаря внедрению обобщений прикладной интерфейс СО11ес11опя АР1 значительно расширился, в результате чего количество классов коллекций и интерфейсов удвоилось. Обобщенные коллекции объявляются в пространстве имен Яуя тем. СО11есС1опя . Оепег1с. Как правило, классы обобщенных коллекций являются не более чем обобщенными эквивалентами рассматривавшихся ранее классов необобщенных коллекций, хотя это соответствие не является взаимно однозначным.
Например, в классе обобщенной коллекции Ь1пкеггЬ1вс реализудтся двунаправленный список, тогда как в необобщенном эквиваленте его не существуег. В некоторых случаях одни и те же функции существуют параллельно в классах обобщенных и необобщенных коллекций, хотя и под разными именами. 866 часть и. Библиотека сз Так, обобщенный вариант класса Агтауь1эс называется Ь1з с, а обобщенный вариант класса НаэлтаЬ1е — РтсС1опагу. Кроме того, конкретное содержимое различных интерфейсов и классов реорганизуется с минимальными изменениями для переноса некоторых функций из одного интерфейса в другой.
Но в целом, имея ясное представление о необобщенных коллекциях, можно без особого труда научиться применять и обобщенные коллекции. Как правило, обобщенные коллекции действуют по тому же принципу, что и необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций.
А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций. Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они описываются далее по порядку. Интерфейсы обобщенных коллекций В пространстве имен Бузсев.
Со11естгопз. Сепег1с определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций. Все эти интерфейсы сведены в табл. 24.10. Таблица 24.10. Интерфейсы обобщенных коллекций Интерфейс Описание 1Со11есс1оп<Т> 1соврагег<т> Определяет основополагающие свойства обобщенных коллекций Определяет обобщенный метод совраге () для сравнения объектов, хранящихся в коллекции Определяет обобщенную коллекцию, состоящую нз пар "ключ- значение" гптссгопагу<тк, тч> 1хпивегаЬ1е<Т> Определяет обобщенный метод аесхпивегасог (), предоставляющий перечнспнтепь для любого класса коллекции Предоставляет методы, позволяющие получать содержимое коллек- ции по очереди Сравнивает даа объекта на предмет равенства Определяет обобщенную коллекцию, доступ к которой можно получить с помощью нндексатора Впивегагог<Т> 1ВЧиа11Сусоврагег<т> 111зс<т> гпс сорос ( десг ) Ьоо1 1авеас(пп1у ( десг Свойство Соипг содержит ряд элементов, хранящихся в данный момент в коллекции.
А свойство 1знеа<(Оп1у имеет логическое значение Сгце, если коллекция доступна только для чтения. Если же коллекция доступна как для чтения, так и для записи, то данное свойство имеет логическое значение Та1зе. ИнтерфейС 1Со11есСдоп<т> В интерфейсе 1со11есггоп<т> определен ряд свойств, которые являются общими длй всех обобщенных коллекций.
Интерфейс 1СС11есссоп<т> является обобщенным вариантом необобщенного интерфейса 1СС11есс1оп, хотя между ними имеются некоторые отличия. Итак, в интерфейсе 1Со11есттоп<т> определены следующие свойства: Глава 24. Коллекции, перечиспигепи к ктераторы 867 Метод чотп АПС(Т оЬУ) Описание Добавляет объект оЬУ в вызывающую коллекцию.
Генерирует ис- ключение носэиррогсепехсерстоп, если коллекция доступна толькодля чтения чогб С1еаг() Ьоо1 Сопга1пя(Т оЬУ) Удаляет все элементы из вызывающей коллекции Возвращает логическое значение сгие, если вызывающая кол- лекция содержит объект оьу, в противном случае — логическое значение га1яе чотп Соруто (т(] сягрег, Копирует содержимое вызывающей коллекции в целевой массив 1пС ягягг1с)х] СагдеС, начиная С ЭлЕмЕнта, укаэываЕмсгО пО индЕкСу ягагг1сх чо1С Кепюче Т оЬУ) Удаляет первое вхождение объекта оЬУ в вызывающей коллекции. Возвращает логическое значение сгче, если обьект оЬУ удален. А если этот объект не найден в вызывающей коллекции, то возвра- щается логическое значение Тя1яе Некоторые из перечисленных выше методов генерируют исключение Но С5црроггес(Ех серг 1 оп, если коллекция доступна только для чтения.
А поскольку интерфейс 1Со11есг1оп<Т> наследует от интерфейсов 1Еппюегаые и 1Еппюегаые<т>, то он включает в себя также обобщенную и необобшениую формы метода песепшпегасог (], Благодаря тому что интерфейс 1со11есстоп<т> наследует от интерфейса 1ЕпиюегаЫе<Т>, в нем поддерживаются также методы расширения, определенные в классе епщпегаЫе. Несмотря иа то что методы расширения предназначены главным образом для поддержки Е]ХЯ, им можно найти и другое применение, в том числе и в коллекциях. Интерфейс 1йде с<т> В интерфейсе 1стя С<т> определяется такое поведение обобщенной коллекции, которое позволяет осуществлять доступ к ее элементам по индексу с отсчетом от нуля.