Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 167
Текст из файла (страница 167)
То, что в программировании иа С++ называется контейнером, в программироваиии иа С№ называется ноллвлзкивй. Это же относится и к ~ача. Если вы знакомы с библиотекой Сойесйопз Егагпеччогх для ~ача, то научиться пользоваться коллекциями в С№ ие составит для вас большого труда. 1лааа 24.
Коллекции, перечислителн н итератори 839 В силу характерных отличий каждый нз четырех типов коллекций (необобщенных, обобщенных, специальных и с поразрядной организацией) будет рассмотрен далее в этой главе отдельно. Необобщенные коллекции Интерфейсы необобщенных коллекций В пространстве имен е узкою. Со11ессъопэ определен целый ряд интерфейсов необобщенных коллекций. Но начать их рассмотрение следует с интерфейсов коллекций, поскольку они определяют функциональные возможности, которые являются общими для нсех классов необобщенных коллекций. Интерфейсы, служащие опорой для необобщенных коллекций, сведены в табл.
24.1. Каждый из этих интерфейсов подробно описывается далее. Таблица 24.1. Интерфейсы необобщениых коллекций Описание Интерфейс 1Со11еск1он Определяет элементы, которые должны иметь все необобщенные коллекции 1Соирагег Определяет метод соираге () для сравнения объектов, хранящихся в коллекции 1пъссгопагу 1вьск1онагуЕпсиегаког Определяет коллекцию, состоящую из пар "ключ — значение" Определяет перечислитель для коллекции, реализующей интерфейс 1аъск1онагу 1Епииегаъге Определяет метод аегенииегагог (), предоставляющий перечисли- тель для любого класса коллекции 1Енижегагог Предоставляет методы, позволяющие получать содержимое коллек- ции по очереди 1ЕЧиа1(сусоирагег 1яазПСоееРготгдег Сравнивает два объекта на предмет равенства Считается устаревшим.
Вместо него следует использовать интер- фэйо 1ЕЧна11сусоирагег 1възк Определяет коллекцию, доступ к которой можно получить с помощью индексатора Необобщенные коллекции вошли в состав среды .ХЕТ Егашешог)( еще в версии 1.0. Они определяются в пространстве имен Еуэсею. Со11ессвопэ. Необобщенные коллекции представляют собой структуры данных общего назначения, оперирующие ссылками на объекты.
Таким образом, они позволяют манипулировать объектом любого типа, хотя и не типизированным способом. В этом состоит их преимущество и в то же время недостаток. Благодаря тому что необобщенные коллекции оперируют ссылками на объекты, в них можно хранить разнотипные данные. Это удобно в тех случаях, когда требуется манипулировать совокупностью разнотипных объектов или же когда типы хранящихся в коллекции объектов заранее неизвестны. Но если коллекция предназначается для хранения,объекта конкретного типа, то необобщенные коллекции не обеспечивают типовую безопасность, которую можно обнаружить в обобщенных коллекциях.
Необобщенные коллекции определены в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они рассматриваются далее по порядку. 840 Часть )). Библиотека С№ Интерфейс 1Со11есйдоп Интерфейс 1Со11есс1оп служит основанием, на котором построены все необобщенные коллекции. В нем объявляются основные методы и свойства для всех необобщенных коллекций. Он также наследует от интерфейса 1ЕппвегаЫе. В интерфейсе 1Со11есг1оп определяются перечисленные ниже свойства.
Свойство Назначение 1пс сопле ( песк ) Содержит количество элементов а коллекции на данный момент Ьоо1 1ззупсьгопагео ( Яесг ) Принимает логическое значение ггпе, если коллекция синхронизирована, иначе — логическое значение га1зе. По умолчанию коллекции не синхронизированы. Но для большинства коллекций можно получить синхронизированный вариант оьбесг яупсноог ( оегг ) Содержит объект, дпя которого коллекция может быть син- хронизирована Свойство Сопле используется чаще всего, поскольку оно содержит количество элементов, хранящихся в коллекции на данный момент.
Если значение свойства соппг равно нулю, то коллекция считается пустой. В интерфейсе 1Со11ессаоп определяется следующий метод: хогЙ соруто(хггау гагдес, гпс зсагсгг)х) Метод спрута () копирует содержимое коллекции в массив гадес, начиная с элемента, указываемого по индексу зсагсгс)х. Следовательно, метод соруто() обеспечивает в С№ переход от коллекции к стандартному массиву.
Благодаря тому что интерфейс 1со11есг1оп наследует от интерфейса 1епивегаь1е, в его состав входит также единственный метод, определенный в интерфейсе 1Еппве гаЫе. Это метод БеСЕппвегаког (), объявляемый следующим образом: 1Епшлегасог СеГЕппвегасог() Он возвращает перечислитель для коллекции. Вследствие того же наследования от интерфейса 1ЕппвегаЫе в интерфейсе 1со11есс1оп определяются также три следующих метода расширения: )ьзцпегуаые (), СаяТ () и ОТТуре () . В частности, метод АзОпегуаЫе () объявляется в классе Бузгев. Е1пс(. ОпегуаЫе, а методы СаяТ () и ОТТуре () — в классе Бузгев.
Е1пг).ЕппвегаЫе. Эти методы предназначены главным образом для поддержки ) 1)ЧО, хотя их можно применять и в других целях. Интерфейс 1Ьде С В интерфейсе 1Ь1зс объявляется такое поведение необобщенной коллекции, которое позволяет осуществлять доступ к ее элементам по индексу с отсчетом от нуля. Этот интерфейс наследует от интерфейсов 1Со11есс1оп и 1ЕппвегаЫе.
Помимо методов, определенных в этих интерфейсах, в интерфейсе 111зг определяется ряд собственных методов. Все эти методы сведены в табл. 24.2. В некоторых из них предусматривается модификация коллекции. Если же коллекция доступна только для чтения илн имеет фиксированный размер, то в этих методах генерируется исключение ногзпрроггег)ехсерг1оп. Глава 24. Коллекции, перечислители и итераторн 841 Таблица 24.2. Методы, определенные е интерфейсе ХЬхвв Метод Описание ьпС йс(с)(оь)есг оЬУ) Добавляет объект оьу в вызывающую коллекцию. Возвращает индекс, по которому этот объект сохра- няется нося С1еег () Ьоо1 Сопгаспя(оьзесг оЬУ) Удаляет все элементы из вызывающей коллекции Возвращает логическое значение сгпе, если вызы- вающая коллекция содержит объект оь11 иначе — ло- гическое значение ге1яе гпг 1поехОГ(оь)есг оЬУ) Возвращает индекс объекта оьу, если этот объект со- держится а вызывающей коллекции.
Если же объект оьт не обнаружен, то метод возвращает значение -1 нога 1пяегг(ьпг 1с(х, оьзесг оЬУ) Вставляет в вызывающую коллекцию объект ЬЬУ по индекеу хс(х. Зпемеиты, находившиеся до этого по ин- де)ссу 1с(х и дальше, смещаются вперед, чтобы осво- бодить место дпя вставляемого объекта оьу нога неионе(оьйесс сьй) Удаляет первое вхождение объекта оьу в вызывающей коллекции. Злементы, находившиеся до этого эа уда- ленным элементом, смещаются назад, чтобы устра- нить образовавшийся "пробел" нога аееснейг (спг хых) Удаляет из вызывающей коллекции объект, рас- положенный по указанному индексу 1с(х. Элементы, находившиеся до этого за удаленным элементом, смещаются назад, чтобы устранить образовавшийся "пробел" Ьоо1 1ят1хеяясае ( дегк ) ЬОО1 1ЯНЕЕСЮП1У ( СЕС1 ) Если коллекция имеет фиксированный размер, то свойство 1я УЬхес(В1хе содержит логическое значение сгце.
Это означает, что в такую коллекцию нельзя ни вставлять элементы, ни удалять их из нее. Если же коллекция доступна только для чтения, то свойство 1яиеас(Оп1у содержит логическое значение Сгпе. Это означает, что содержимое такой коллекции не подлежит изменению. Кроме того, в интерфейсе 1ВЕяС определяется следующий индексатор: оьйесс сьья(гпс хс(х) ( песк яес; ) Объекты добавляются в коллекцию типа 1 11 я с путем вызова метода йс(с( ( ) .
Обратите внимание на то, что метод йсы () принимает аргумент типа оьб еос. А поскольку оьч есс является базовым классом для всех типов, то в необобщенной коллекции может быть сохранен объект любого типа, включая и типы значений, в силу автоматической упаковки и распаковки. Для удаления элемента из коллекции служат методы иеюоне () и иеюонейс () . В частности, метод иеюоне О удаляет указанный объект, а метод Вепонейс () удаляет объект по указанному индексу.
И для опорожнения коллекции вызывается метод В1еег (), Для того чтобы выяснить, содержится ли в коллекции конкретный объект, вызывается метод Вопса1пя () . Для получения индекса объекта вызывается метод 1пс(ех01 (), а для вставки элемента в коллекцию по указанному индексу — метод 1пяегг () . В интерфейсе 1Ь1яС определяются следующие свойства: 842 Часть П. Библиотека СЗ Этот индексатор служит для получения и установки зиачения элемента коллекции. Но его иельзя использовать для добавления в коллекцию нового элемента. С этой целью обычно вызывается метод дс(б () .