Когда следует использовать универсальные коллекции
При использовании универсальных коллекций автоматически обеспечивается безопасность типов без необходимости наследования от базового типа коллекции и реализации элементов определенного типа. Типы универсальных коллекций обычно работают лучше, чем соответствующие типы неуниверсальных коллекций (и лучше, чем типы, являющиеся производными от базовых типов неуниверсальных коллекций), если элементами коллекции являются типы значений, поскольку при использовании универсальных коллекций упаковывать элементы не требуется.
В программах, предназначенных для .NET Standard 1.0 или более поздней версии, следует использовать универсальные классы-коллекции в пространстве имен System.Collections.Concurrent, когда несколько потоков может одновременно добавлять элементы в коллекцию или удалять их оттуда. Кроме того, если требуется неизменность, рассмотрите универсальные классы коллекций в пространстве имен System.Collections.Immutable.
Следующие универсальные типы соответствуют существующим типам коллекций.
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>, ImmutableQueue<T>, ImmutableArray<T>, SortedList<TKey,TValue> и ImmutableSortedSet<T> соответствуют аналогичным неуниверсальным классам с теми же именами.
Дополнительные типы
Несколько типов универсальных коллекций не имеют неуниверсальных аналогов. Среди них следующие страны:
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
.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ to Objects
Функция 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> позволяют задавать собственные сравнения на равенство.