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


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

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

Для программ, предназначенных для .NET Standard 1.0 или более поздней версии, используйте универсальные классы коллекций в System.Collections.Concurrent пространстве имен, когда несколько потоков могут добавлять или удалять элементы из коллекции одновременно. Кроме того, если необходимо неизменяемость, рассмотрите универсальные классы коллекции в System.Collections.Immutable пространстве имен.

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

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

Несколько универсальных типов коллекций не имеют негенерических аналогов. К ним относятся следующие элементы:

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

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

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

  • BlockingCollection<T> реализует класс коллекции с ограничивающими и блокирующими функциями.

  • ConcurrentBag<T> обеспечивает быстрое вставка и удаление неупорядоченных элементов.

Неизменяемые построители

Если вам нужен функционал неизменяемости в вашем приложении, пространство имен System.Collections.Immutable предоставляет универсальные типы коллекций, которые вы можете использовать. Все неизменяемые типы коллекций предлагают Builder классы, которые позволяют оптимизировать производительность при выполнении нескольких изменений. Класс Builder пакетирует операции в изменяемом состоянии. После завершения всех мутаций вызовите ToImmutable метод для "заморозки" всех узлов и создайте неизменяемую универсальную коллекцию, например ImmutableList<T>.

Объект Builder можно создать, вызвав негенерический CreateBuilder() метод. Из экземпляра Builder можно вызвать ToImmutable(). Аналогичным образом, из коллекции Immutable* можно вызвать ToBuilder(), чтобы создать экземпляр построителя из обобщённой неизменяемой коллекции. Ниже приведены различные Builder типы.

LINQ для объектов

Функция LINQ to Objects позволяет использовать запросы LINQ для доступа к объектам в памяти, если тип объекта реализует System.Collections.IEnumerable или System.Collections.Generic.IEnumerable<T> интерфейс. Запросы LINQ предоставляют общий шаблон для доступа к данным; обычно являются более краткими и читаемыми, чем стандартные foreach циклы; и предоставляют возможности фильтрации, упорядочивания и группировки. Запросы LINQ также могут повысить производительность. Дополнительные сведения см. в документации LINQ to Objects (C#), LINQ to Objects (Visual Basic) и 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> позволяют указать собственные сравнения равенства.

См. также