Программные объекты в языке C# могут объединяться в коллекции. Благодаря коллекциям возможна эффективная групповая обработка объектов (причем, необязательно однотипных). Наиболее востребованы в программах коллекции обобщенного и необобщенного типа.
Необобщенные коллекции соответствуют ряду типовых структур данных, к которым относятся:
- Динамический массив ArrayList, способный, подобно контейнеру vector в STL, увеличивать свой размер при необходимости;
- хеш-таблицу для пар "ключ-значение” Hashtable;
- очередь Queue, работающая по принципу FIFO ("первым пришел — первым вышел");
- отсортированный список пар "ключ-значение" SortedList, являющийся аналогом контейнера map в STL;
- стек Stack, реализующий обработку по принципу LIFO)"первым пришел — последним вышел").
Особенность необобщенных коллекций заключается в том, что они хранят данные в виде ссылок на тип Object. Так как этот тип данных является базовым для всех типов CLS, в необобщенные коллекции можно объединять данные любого типа.
Функциональность необобщенных коллекций декларируется специализированными интерфейсами [4](см. таблицу 4).
Таблица 4. Интерфейсы необобщенных коллекций
| Интерфейс | Описание |
| ICollection | Определяет элементы, которые должны иметь все необобщенные коллекции |
| IComparer | Определяет метод Compare() для сравнения объектов, хранящихся в коллекции |
| IDictionary | Определяет коллекцию, состоящую из пар "ключ-значение" |
| IDictionaryEnumerator | Определяет перечислитель для коллекции, реализующей интерфейс IDictionary |
| IEnumerable | Определяет метод GetEnumerator (), предоставляющий перечислитель для любого класса коллекции |
| IEnumerator | Предоставляет методы, позволяющие получать содержимое коллекции по очереди |
| IEqualityComparer | Сравнивает два объекта на предмет равенства |
| IList | Определяет коллекцию, доступ к которой можно получить с помощью индексатора |
| IStructuraIComparable | Определяет метод CompareTo(), применяемый для структурного сравнения |
| IStructuralEquatable | Определяет метод Equals(), применяемый для выяснения структурного, а не ссылочного равенства. Кроме того, определяет метод GetHashCode() |
Классы и интерфейсы необобщенных коллекций находятся в пространстве имен System.Collections.
Обобщенные коллекции реализуют принцип обобщенного программирования для стандартных структур данных, в том числе имеющих реализации в виде необобщенных коллекций. Обобщенные коллекции (таблица 5) обеспечивают безопасность типизации, поскольку могут хранить объекты лишь одного типа данных.
Таблица 5. Обобщенные коллекции языка C#
| Обобщенная коллекция | Описание |
| Dictionary<Tkey, TValue> | Сохраняет пары "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс Hashtable |
| HashSet<T> | Сохраняет ряд уникальных значений, используя хештаблицу |
| LinkedList<T> | Сохраняет элементы в двунаправленном списке |
| List<T> | Создает динамический массив. Обеспечивает такие же функциональные возможности, как и необобщенный класс ArrayList |
| Queue<T> | Создает очередь. Обеспечивает такие же функциональные возможности, как и необобщенный класс Queue |
| SortedDictionary<TKey, TValue> | Создает отсортированный список из пар "ключ-значение" |
| SortedList<TKey, TValue> | Создает отсортированный список из пар "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс SortedList |
| SortedSet<T> | Создает отсортированное множество |
| Stack<T> | Создает стек. Обеспечивает такие же функциональные возможности, как и необобщенный класс Stack |