Как правило, обобщенные коллекции действуют по тому же принципу, что и-необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций. А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций.
Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они описываются далее по порядку.
Интерфейсы обобщенных коллекций
В пространстве имен System. Collections. Generic определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций. Все эти интерфейсы сведены в табл. 25.10.
Таблица 25.10. Интерфейсы обобщенных коллекций
Интерфейс Описание
lCollectionОпределяет основополагающие свойства обобщенных
коллекций
1Сотрагег<���т>Определяет обобщенный метод Compare ()для сравнения объектов, хранящихся в коллекции lDictionaryОпределяет обобщенную коллекцию, состоящую из пар
“ключ-значение"
Окончание табл. 25.10
Интерфейс
Описание
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)
void Clear()
bool Contains(T item)
void CopyTo(T[] array, int arraylndex)
void Remove(T item)
Добавляет элемент item в вызывающую коллекцию. Генерирует исключение NotSupportedException,если коллекция доступна только для чтения Удаляет все элементы из вызывающей коллекции Возвращает логическое значение true,если вызывающая коллекция содержит элемент item , а иначе — логическое значение false
Копирует содержимое вызывающей коллекции в массив array , начиная с элемента, указываемого по индексу
arraylndex
Удаляет первое вхождение элемента item в вызывающей коллекции. Возвращает логическое значение true,если элемент i tem удален. А если этот элемент не найден в вызывающей коллекции, то возвращается логическое значение false
Некоторые из перечисленных выше методов генерируют исключение NotSupportedException, если коллекция доступна только для чтения.
А поскольку интерфейс ICollection наследует от интерфейсов IEnumerable и IEnumerable, то он включает в себя также обобщенную и необобщенную формы метода GetEnumerator ().
Благодаря тому что в интерфейсе ICollection реализуется интерфейс IEnumerable, в нем поддерживаются также методы расширения, определенные в классе Enumerable. Несмотря на то что методы расширения предназначены главным образом для поддержки LINQ, им можно найти и другое применение, в том числе и в коллекциях.
Читать дальше