Кроме того, в пространстве имен System.Collectionsопределены три базовых абстрактных класса: CollectionBase, ReadOnlyCollectionBaseи DictionaryBase. Эти классы могут наследоваться и служить в качестве отправной точки для разработки собственных специальных коллекций.
Благодаря внедрению обобщений прикладной интерфейс Collections API значительно расширился, в результате чего количество классов коллекций и интерфейсов удвоилось. Обобщенные коллекции объявляются в пространстве имен System.Collections.Generic. Как правило, классы обобщенных коллекций являются не более чем обобщенными эквивалентами рассматривавшихся ранее классов необобщенных коллекций, хотя это соответствие не является взаимно однозначным. Например, в классе обобщенной коллекции LinkedListреализуется двунаправленный список, тогда как в необобщенном эквиваленте его не существует. В некоторых случаях одни и те же функции существуют параллельно в классах обобщенных и необобщенных коллекций, хотя и под разными именами. Так, обобщенный вариант класса ArrayListназывается List, а обобщенный вариант класса HashTable— Dictionary. Кроме того, конкретное содержимое различных интерфейсов и классов реорганизуется с минимальными изменениями для переноса некоторых функций из одного интерфейса в другой. Но в целом, имея ясное представление о необобщенных коллекциях, можно без особого труда научиться применять и обобщенные коллекции.
Как правило, обобщенные коллекции действуют по тому же принципу, что и-необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций. А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций.
Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они описываются далее по порядку.
Интерфейсы обобщенных коллекций
В пространстве имен System.Collections.Generic определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций. Все эти интерфейсы сведены в табл. 25.10.
Таблица 25.10. Интерфейсы обобщенных коллекций
Интерфейс - Описание
lCollection - Определяет основополагающие свойства обобщенных коллекций
IComparerОпределяет обобщенный метод Compare()для сравнения объектов, хранящихся в коллекции lDictionaryОпределяет обобщенную коллекцию, состоящую из пар “ключ-значение"
IEnumerable - Определяет обобщенный метод GetEnumerator(), предоставляющий перечислитель для любого класса коллекции
Enumerator - Предоставляет методы, позволяющие получать содержимое коллекции по очереди
IEqualityComparer -Сравнивает два объекта на предмет равенства
IList -Определяет обобщенную коллекцию, доступ к которой можно получить с помощью индексатора
Интерфейс ICollection
В интерфейсе ICollectionопределен ряд свойств, которые являются общими для всех обобщенных коллекций. Интерфейс ICollectionявляется обобщенным вариантом необобщенного интерфейса ICollection, хотя между ними имеются некоторые отличия.
Итак, в интерфейсе ICollectionопределены следующие свойства.
int Count { get; }
bool IsReadOnly { get; }
Свойство Countсодержит ряд элементов, хранящихся в данный момент в коллекции. А свойство IsReadOnlyимеет логическое значение true, если коллекция доступна только для чтения. Если же коллекция доступна как для чтения, так и для записи, то данное свойство имеет логическое значение false.
Кроме того, в интерфейсе ICollectionопределены перечисленные ниже методы. Обратите внимание на то, что в этом обобщенном интерфейсе определено несколько большее количество методов, чем в его необобщенном аналоге.
Метод -Описание
void Add(T item) - Добавляет элемент item в вызывающую коллекцию. Генерирует исключение NotSupportedException,если коллекция доступна только для чтения
void Clear() -Удаляет все элементы из вызывающей коллекции
Читать дальше