Добавить в цитаты Настройки чтения

Страница 457 из 502

<b>Содержимое коллекции bа после логической операции NOT:</b>

<b>True   True   True   True   True   True   True   True</b>

<b>Содержимое коллекции bа2:</b>

<b>True   True   False  False  False  False  True   False</b>

<b>Результат логической операции ba XOR bа2:</b>

<b>False  False  True   True   True   True   False  True</b>

Специальные коллекции

В среде .NET Framework предусмотрен ряд специальных коллекций, оптимизированных для работы с данными конкретного типа или для их обработки особым образом. Классы этих необобщенных коллекций определены в пространстве имен System.Collections.Specialized и перечислены ниже.

Класс специальной коллекции - Описание

CollectionsUtil - Содержит фабричные методы для создания коллекций

HybridDictionary - Предназначен для коллекций, в которых для хранения небольшого количества пар “ключ-значение” используется класс ListDictionary. При превышении коллекцией определенного размера автоматически используется класс Hashtable для хранения ее элементов

ListDictionary - Предназначен для коллекций, в которых для хранения пар “ключ-значение" используется связный список. Такие коллекции рекомендуются только для хранения небольшого количества элементов

NameValueCollection - Предназначен для отсортированных коллекций, в которых хранятся пары “ключ-значение”, причем и ключ, и значение относятся к типу string

OrderedDictionary - Предназначен для коллекций, в которых хранятся индексируемые пары “ключ-значение”

StringCollection - Предназначен для коллекций, оптимизированных для хранения символьных строк

StringDictionary - Предназначен для хеш-таблиц, в которых хранятся пары “ключ-значение”, причем и ключ, и значение относятся к типу string

Кроме того, в пространстве имен System.Collections определены три базовых абстрактных класса: CollectionBase, ReadOnlyCollectionBase и DictionaryBase. Эти классы могут наследоваться и служить в качестве отправной точки для разработки собственных специальных коллекций.

Обобщенные коллекции

Благодаря внедрению обобщений прикладной интерфейс Collections API значительно расширился, в результате чего количество классов коллекций и интерфейсов удвоилось. Обобщенные коллекции объявляются в пространстве имен System.Collections.Generic. Как правило, классы обобщенных коллекций являются не более чем обобщенными эквивалентами рассматривавшихся ранее классов необобщенных коллекций, хотя это соответствие не является взаимно однозначным. Например, в классе обобщенной коллекции LinkedList реализуется двунаправленный список, тогда как в необобщенном эквиваленте его не существует. В некоторых случаях одни и те же функции существуют параллельно в классах обобщенных и необобщенных коллекций, хотя и под разными именами. Так, обобщенный вариант класса ArrayList называется List, а обобщенный вариант класса HashTable — Dictionary. Кроме того, конкретное содержимое различных интерфейсов и классов реорганизуется с минимальными изменениями для переноса некоторых функций из одного интерфейса в другой. Но в целом, имея ясное представление о необобщенных коллекциях, можно без особого труда научиться применять и обобщенные коллекции.

Как правило, обобщенные коллекции действуют по тому же принципу, что и-необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций. А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций.

Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они описываются далее по порядку.

Интерфейсы обобщенных коллекций

В пространстве имен System.Collections.Generic определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций. Все эти интерфейсы сведены в табл. 25.10.

Таблица 25.10. Интерфейсы обобщенных коллекций

Интерфейс -  Описание

lCollection<T> - Определяет основополагающие свойства обобщенных коллекций

IComparer<T> Определяет обобщенный метод Compare() для сравнения объектов, хранящихся в коллекции lDictionary<Tkey, TValue> Определяет обобщенную коллекцию, состоящую из пар “ключ-значение"

IEnumerable<T> - Определяет обобщенный метод GetEnumerator(), предоставляющий перечислитель для любого класса коллекции

Enumerator<T> - Предоставляет методы, позволяющие получать содержимое коллекции по очереди

IEqualityComparer<T> - Сравнивает два объекта на предмет равенства

IList<T> - Определяет обобщенную коллекцию, доступ к которой можно получить с помощью индексатора

В интерфейсе ICollection&lt;T&gt; определен ряд свойств, которые являются общими для всех обобщенных коллекций. Интерфейс ICollection&lt;T&gt; является обобщенным вариантом необобщенного интерфейса ICollection, хотя между ними имеются некоторые отличия.

Итак, в интерфейсе ICollection&lt;T&gt; определены следующие свойства.

<b>int Count { get; }</b>

<b>bool IsReadOnly { get; }</b>

Свойство Count содержит ряд элементов, хранящихся в данный момент в коллекции. А свойство IsReadOnly имеет логическое значение true, если коллекция доступна только для чтения. Если же коллекция доступна как для чтения, так и для записи, то данное свойство имеет логическое значение false.

Кроме того, в интерфейсе ICollection&lt;T&gt; определены перечисленные ниже методы. Обратите внимание на то, что в этом обобщенном интерфейсе определено несколько большее количество методов, чем в его необобщенном аналоге.