В теме Обобщенные типы мы уже говорили про обобщения: как создавать и использовать обобщенные классы, роль универсального параметра T. Обобщенные коллекции - это те же самые обобщенные классы. И опять же их использование перед необобщенными коллекциями имеет те же преимущества: повышение производительности (не надо тратить время на упаковку и распаковку объекта) и повышенная типобезопасность.
Классы обобщенных коллекций находятся в пространстве имен System.Collections.Generic. Функционал коллекций также по большей части описывается в обобщенных интерфейсах.
Только интерфейсы обобщенных коллекций отличаются от необобщеных двойников не только наличием универсального параметраT
,
но и самой функциональностью. Рассмотрим основные интерфейсы обобщенных коллекций:
IEnumerable<T>: определяет метод GetEnumerator
, с помощью которого можно получать элементы любой коллекции
foreach
IEnumerator<T>: определяет методы, с помощью которых потом можно получить содержимое коллекции по очереди
ICollection<T>: представляет ряд общих свойств и методов для всех обобщенных коллекций
(например, методы CopyTo, Add, Remove, Contains
, свойство Count
)
IList<T>: предоставляет функционал для создания последовательных списков
IComparer<T>: определяет метод Compare
для сравнения двух однотипных объектов
IDictionary<TKey, TValue>: определяет поведение коллекции, при котором она должна хранить объекты в виде пар ключ-значение: для каждого объекта определяется уникальный ключ типа, указанного в параметре TKey, и этому ключу соответствует определенное значение, имеющее тип, указанный в параметре TValue
IEqualityComparer<T>: определяет методы, с помощью которых два однотипных объекта сравниваются на предмет равенства
Эти интерфейсы реализуются следующими классами коллекций в пространстве имен System.Collections.Generic
:
List<T>: класс, представляющий последовательный список. Реализует интерфейсы IList<T>, ICollection<T>, IEnumerable<T>
Dictionary<TKey, TValue>: класс коллекции, хранящей наборы пар "ключ-значение". Реализует интерфейсы ICollection<T>, IEnumerable<T>, IDictionary<TKey, TValue>
LinkedList<T>: класс двухсвязанного списка. Реализует интерфейсы ICollection<T> и IEnumerable<T>
Queue<T>: класс очереди объектов, работающей по алгоритму FIFO("первый вошел -первый вышел"). Реализует интерфейсы ICollection, IEnumerable<T>
SortedSet<T>: класс отсортированной коллекции однотипных объектов. Реализует интерфейсы ICollection<T>, ISet<T>, IEnumerable<T>
SortedList<TKey, TValue>: класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. Реализует интерфейсы ICollection<T>, IEnumerable<T>, IDictionary<TKey, TValue>
SortedDictionary<TKey, TValue>: класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. В общем похож на класс SortedList<TKey, TValue>, основные отличия состоят лишь в использовании памяти и в скорости вставки и удаления
Stack<T>: класс стека однотипных объектов. Реализует интерфейсы ICollection, IReadOnlyCollection<T> и IEnumerable<T>
Большинство обобщенных классов коллекций дублируют необобщенные классы коллекций. Но если вам не надо хранить объекты разных типов, то предпочтительнее использовать обобщенные коллекции.
Рассмотрим основные обобщенные коллекции.