Поделиться через


Определение коллекций

Обновлен: Ноябрь 2007

Коллекция представляет собой набор объектов схожих типов, сгруппированных вместе.

Объекты любого типа могут быть сгруппированы в одну коллекцию типа Object, чтобы воспользоваться преимуществами конструкций, свойственных определенному языку. Например, оператор foreach языка C# (for each в Visual Basic) предполагает, что все объекты коллекции имеют один и тот же тип.

Однако в коллекции типа Object происходит дополнительная индивидуальная обработка элементов, к примеру, упаковка и распаковка или преобразования, что влияет на производительность коллекции. Упаковка и распаковка обычно происходят при сохранении или извлечении типа значений из коллекции типа Object.

Универсальные коллекции, такие как List<T> и строго типизированные неуниверсальные коллекции, такие как StringCollection, позволяют избежать проблем с производительностью, если тип элемента является типом, для которого предназначена коллекция (например, сохранение или извлечение строк из StringCollection). Кроме того, при добавлении элемента в строго типизированную коллекцию выполняется автоматическая проверка типа такого элемента.

Все коллекции, которые прямо или косвенно реализуют интерфейс ICollection или универсальный интерфейс ICollection<T> имеют несколько общих функциональных возможностей наряду с методами, которые выполняют добавление, удаление или поиск элементов:

  • Перечислитель.

    Перечислитель — это объект, который выполняет итерацию в связанной с ним коллекции. Можно считать, что он является перемещаемым указателем на любой элемент коллекции. Перечислитель может быть связан только с одной коллекцией, но коллекция может иметь несколько перечислителей. Оператор foreach языка C# (for each в Visual Basic) использует перечислитель и упрощает обращение с перечислителем.

  • Элементы синхронизации.

    Синхронизация обеспечивает потокобезопасность при доступе к элементам коллекции. По умолчанию коллекции не являются потокобезопасными. Только несколько классов в пространствах имен System.Collections предоставляют метод Synchronize, который создает потокобезопасную обертку для коллекции. Однако все классы во всех пространствах имен System.Collections предоставляют свойство SyncRoot, которое может быть использовано производными классами для создания собственной потокобезопасной обертки. Свойство IsSynchronized также используется для определения потокобезопасности коллекции. Синхронизация недоступна в универсальном интерфейсе ICollection<T>.

  • CopyTo метод.

    Все коллекции могут быть скопированы в массив с помощью метода CopyTo; однако порядок элементов в новом массиве зависит от того, в какой последовательности их возвращает перечислитель. Результирующий массив всегда является одномерным массивом с нижней границей, равной нулю.

Обратите внимание, что универсальный интерфейс ICollection<T> имеет дополнительные члены, в которые не включен неуниверсальный интерфейс.

В некоторых классах пространств имен System.Collections реализованы следующие возможности:

  • Емкость и количество элементов.

    Емкость коллекции — это число элементов, которое она может содержать. Количество элементов коллекции — это число элементов, которое она реально содержит. BitArray является особым случаем; её емкость совпадает с его длиной, которая совпадает с количеством элементов коллекции. Некоторые коллекции скрывают емкость и/или количество элементов.

    Все коллекции пространств имен System.Collections автоматически увеличивают емкость, если количество элементов достигает предела. Происходит перераспределение памяти, и элементы копируются из старой коллекции в новую. Это уменьшает объем кода, необходимого для использования коллекции; однако производительность при работе с такой коллекцией может ухудшиться. Наилучший способ избежать потерь производительности, вызванных множественными перераспределениями, это установить начальную вместимость, равную предполагаемому размеру коллекции.

  • Нижняя граница.

    Нижняя граница коллекции — это индекс ее первого элемента. Все индексированные коллекции в пространствах имен System.Collections имеют нижнюю границу, равную нулю. Array имеет нижнюю границу, равную нулю, по умолчанию, но при создании экземпляра Array с помощью CreateInstance может быть определена другая нижняя граница.

Обычно классы System.Collections можно разделить на три типа:

  • Часто используемые коллекции.

    Это распространенные виды коллекций данных, такие как хэш-таблицы, очереди, стеки, словари и списки. Часто используемые коллекции имеют свои универсальные и неуниверсальные версии.

  • Битовые коллекции.

    Это коллекции, элементами которых являются битовые флаги. Их поведение слегка отличается от поведения других коллекций.

  • Специализированные коллекции.

    Эти коллекции предназначены для реализации очень узких задач, обычно для обработки элементов определенного типа, такого как StringDictionary.

Следует тщательно выбирать класс коллекции. Наряду с определенными функциональными возможностями каждая коллекция имеет также и собственные ограничения. Чем более специализированной является коллекция, тем она более ограничена. Советы по выбору коллекции содержатся в разделе Выбор класса коллекции.

См. также

Основные понятия

Выбор класса коллекции

Ссылки

System.Collections

System.Collections.Specialized

System.Collections.Generic

Другие ресурсы

Коллекции и структуры данных