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


Когда следует использовать универсальные коллекции

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

Обычно рекомендуется использовать универсальные коллекции, поскольку можно сразу получить преимущества строгой типизации без необходимости наследования от базового типа коллекции и реализации элементов, зависящих от типа. Универсальные типы коллекций также обычно имеют более высокую производительность, чем соответствующие типы нестандартных коллекций (и более высокую производительность, чем типы, унаследованные от нестандартного базового типа коллекции), если элементами коллекции являются типы значений, поскольку при использовании универсальных шаблонов не требуется упаковывать элементы.

Следующие универсальные типы соответствуют существующим типам коллекций:

  • List<T> — это универсальный класс, соответствующий ArrayList.

  • Dictionary<TKey, TValue> — это универсальный класс, соответствующий Hashtable.

  • Collection<T> — это универсальный класс, соответствующий CollectionBase. Класс Collection<T> можно использовать как базовый, но в отличие от CollectionBase он не является абстрактным. Это значительно упрощает его использование.

  • ReadOnlyCollection<T> — это универсальный класс, соответствующий ReadOnlyCollectionBase. Класс ReadOnlyCollection<T> не является абстрактным и имеет конструктор, что облегчает предоставление существующей коллекции List<T> в виде коллекции только для чтения.

  • Универсальные классы Queue<T>, Stack<T> и SortedList<TKey, TValue> соответствуют нестандартным классам с соответствующими именами.

Дополнительные типы

Существует несколько универсальных типов коллекций, у которых нет нестандартных аналогов:

  • LinkedList<T> — это связанный список общего назначения, обеспечивающий операции вставки и удаления с временной характеристикой О(1).

  • SortedDictionary<TKey, TValue> — это сортируемый словарь с операциями вставки и извлечения с временной характеристикой O(log n), что делает его альтернативой SortedList<TKey, TValue>.

  • KeyedCollection<TKey, TItem> — это гибрид списка и словаря, который предоставляет способ хранения объектов, содержащих свои собственные ключи.

LINQ to Objects

Функция LINQ to Objects позволяет использовать LINQ запросы для доступа к объектам в памяти, если тип объекта реализует IEnumerable или IEnumerable<T>. LINQ запросы предоставляют общий шаблон для доступа к данным, являются более четкими и удобочитаемыми, чем стандартные циклы foreach, а также предоставляют возможности фильтрации, сортировки и группировки. LINQ запросы также могут повысить производительность. Дополнительные сведения см. в разделе LINQ to Objects.

Дополнительные функциональные возможности

Некоторые универсальные типы имеют функциональные возможности, отсутствующие в нестандартных типах коллекций. Например, класс 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> позволяют задать собственные функции сравнения для равенств.

См. также

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

Общие сведения об универсальных шаблонах в .NET Framework

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

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