Когда следует использовать универсальные коллекции
Обычно рекомендуется использовать универсальные коллекции, поскольку можно сразу получить преимущества строгой типизации без необходимости наследования от базового типа коллекции и реализации элементов, зависящих от типа. Универсальные типы коллекций также обычно имеют более высокую производительность, чем соответствующие типы нестандартных коллекций (и более высокую производительность, чем типы, унаследованные от нестандартного базового типа коллекции), если элементами коллекции являются типы значений, поскольку при использовании универсальных шаблонов не требуется упаковывать элементы.
В программах, рассчитанных на .NET Framework 4 или более позднюю версию платформы, следует использовать универсальные классы коллекций из пространства имен System.Collections.Concurrent в случаях, когда добавление или удаление элементов коллекции могут одновременно вести несколько потоков.
Следующие универсальные типы соответствуют существующим типам коллекций:
List<T> — это универсальный класс, соответствующий ArrayList.
Dictionary<TKey, TValue> и ConcurrentDictionary<TKey, TValue> — универсальные классы, соответствующие Hashtable.
Collection<T> — это универсальный класс, соответствующий CollectionBase. Класс Collection<T> можно использовать как базовый, но, в отличие от CollectionBase, он не является абстрактным классом. Это значительно упрощает его использование.
ReadOnlyCollection<T> — это универсальный класс, соответствующий ReadOnlyCollectionBase. Класс ReadOnlyCollection<T> не является абстрактным и имеет конструктор, упрощающий предоставление существующего объекта List<T> в качестве коллекции только для чтения.
Универсальные классы Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T> и SortedList<TKey, TValue> соответствуют аналогичным неуниверсальным классам с теми же именами.
Дополнительные типы
Несколько типов универсальных коллекций не имеют нестандартных аналогов. Среди них можно выделить следующие.
LinkedList<T> — это связанный список общего назначения, обеспечивающий операции вставки и удаления с временной характеристикой О(1).
SortedDictionary<TKey, TValue> — это сортируемый словарь с операциями вставки и извлечения с временной характеристикой O(log n), что делает его альтернативой SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> — это гибрид списка и словаря, который предоставляет способ хранения объектов, содержащих свои собственные ключи.
Класс BlockingCollection<T> реализует коллекцию с границами и блокировкой.
Класс ConcurrentBag<T> предоставляет быструю вставку и удаление неупорядоченных элементов.
LINQ to Objects
Функция LINQ to Objects позволяет использовать LINQ запросы для доступа к объектам в памяти, если тип объекта реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable<T>. LINQ запросы предоставляют общий шаблон для доступа к данным, являются более четкими и удобочитаемыми, чем стандартные циклы foreach, а также предоставляют возможности фильтрации, сортировки и группировки. LINQ запросы также могут повысить производительность. Дополнительные сведения см. в разделах LINQ to Objects и Parallel LINQ (PLINQ).
Дополнительные функциональные возможности
Некоторые универсальные типы имеют функциональные возможности, отсутствующие в нестандартных типах коллекций. Например, класс List<T>, который соответствует нестандартному классу ArrayList, имеет ряд методов, которые принимают универсальные делегаты, такие как делегат Predicate<T>, который позволяет указать методы, используемые для поиска в списке, делегат Action<T>, который представляет методы, выполняемые над каждым элементом списка, и делегат Converter<TInput, TOutput>, который позволяет определить преобразование типов.
Класс List<T> позволяет задать собственные реализации универсального интерфейса IComparer<T> для сортировки и поиска в списке. Классы SortedDictionary<TKey, TValue> и SortedList<TKey, TValue> тоже имеют эту возможность. Кроме того, эти классы позволяют задавать методы сравнения при создании коллекции. Аналогично, классы Dictionary<TKey, TValue> и KeyedCollection<TKey, TItem> позволяют задать собственные методы сравнения для равенств.