Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Не забудьте тщательно выбрать класс коллекции. Использование неправильного типа может ограничить использование коллекции.
Это важно
Избегайте использования типов в System.Collections пространстве имен. Рекомендуется использовать универсальные и параллельные версии коллекций благодаря их улучшенной защите типов и другим усовершенствованиям.
Рассмотрим следующие вопросы:
Требуется ли последовательный список, в котором элемент обычно удаляется после извлечения его значения?
Если да, рассмотрите возможность использования Queue класса или Queue<T> обобщенного класса, если вам нужно поведение первым вошел, первым вышел (FIFO). Если требуется поведение «последний пришел, первый ушел» (LIFO), рассмотрите использование класса Stack или универсального класса Stack<T>. Для безопасного доступа из нескольких потоков используйте параллельные версии ConcurrentQueue<T> и ConcurrentStack<T>. Для неизменяемости рассмотрим неизменяемые ImmutableQueue<T> версии и ImmutableStack<T>.
Если нет, рассмотрите возможность использования других коллекций.
Необходимо ли получить доступ к элементам в определенном порядке, например, в порядке FIFO, LIFO или случайным образом?
КлассQueue, а также универсальные Queue<T>ConcurrentQueue<T>ImmutableQueue<T> классы предлагают доступ FIFO. Дополнительные сведения см. в статье "Использование коллекции Thread-Safe".
КлассStack, а также универсальные Stack<T>ConcurrentStack<T>ImmutableStack<T> классы предлагают доступ LIFO. Дополнительные сведения см. в статье "Использование коллекции Thread-Safe".
Универсальный LinkedList<T> класс обеспечивает последовательный доступ либо от головы к хвосту, либо от хвоста к голове.
Необходимо ли получить доступ к каждому элементу по индексу?
Классы ArrayList и StringCollection и универсальный класс List<T> предоставляют доступ к своим элементам через индекс элемента, начиная с нуля. Для неизменяемости рассмотрим неизменяемые универсальные версии ImmutableArray<T> и ImmutableList<T>.
Классы Hashtable, SortedList, ListDictionary и StringDictionary, а также обобщенные классы Dictionary<TKey,TValue> и SortedDictionary<TKey,TValue> предоставляют доступ к своим элементам по ключу элемента. Кроме того, существуют неизменяемые версии нескольких соответствующих типов: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>и ImmutableSortedDictionary<TKey,TValue>.
Классы NameObjectCollectionBase и NameValueCollection, а также универсальные классы KeyedCollection<TKey,TItem> и SortedList<TKey,TValue> обеспечивают доступ к своим элементам по индексу, начиная с нуля, или по ключу элемента.
Будет ли каждый элемент содержать одно значение, сочетание одного ключа и одного значения или сочетание одного ключа и нескольких значений?
Одно значение: используйте любую из коллекций, основанных на интерфейсе IList или универсальном интерфейсе IList<T>. Для неизменяемого параметра рассмотрим универсальный IImmutableList<T> интерфейс.
Один ключ и одно значение: используйте любую из коллекций, основанных на интерфейсе IDictionary или универсальном интерфейсе IDictionary<TKey,TValue>. Для неизменяемого варианта рассмотрим IImmutableSet<T> или IImmutableDictionary<TKey,TValue> универсальные интерфейсы.
Одно значение с внедренным ключом: используйте универсальный KeyedCollection<TKey,TItem> класс.
Используйте класс NameValueCollection для одного ключа и нескольких значений.
Нужно ли отсортировать элементы по-разному от того, как они были введены?
Класс Hashtable сортирует свои элементы по хэш-кодам.
Класс SortedList и универсальные SortedList<TKey,TValue>SortedDictionary<TKey,TValue> классы сортируют их элементы по ключу. Порядок сортировки основан на реализации интерфейса IComparer для класса SortedList и реализации универсального интерфейса IComparer<T> для обобщённых классов SortedList<TKey,TValue> и SortedDictionary<TKey,TValue>. SortedDictionary<TKey,TValue> из двух универсальных типов обеспечивает лучшую производительность, чем SortedList<TKey,TValue>, в то время как SortedList<TKey,TValue> потребляет меньше памяти.
ArrayList Sort предоставляет метод, который принимает реализацию IComparer в качестве параметра. Его универсальный аналог, List<T> универсальный класс, предоставляет Sort метод, который принимает реализацию универсального IComparer<T> интерфейса в качестве параметра.
Требуются ли быстрые поиски и извлечение информации?
- ListDictionary быстрее, чем Hashtable для небольших коллекций (10 элементов или меньше). Универсальный Dictionary<TKey,TValue> класс обеспечивает более быстрый поиск, чем универсальный SortedDictionary<TKey,TValue> класс. Реализация с несколькими потоками является ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> обеспечивает быструю параллельную вставку для неупорядоченных данных. Дополнительные сведения об обоих многопоточных типах см. в разделе "Использование коллекции Thread-Safe".
Нужны ли вам коллекции, принимающие только строки?
StringCollection (на основе IList) и StringDictionary (на основе IDictionary) находятся в System.Collections.Specialized пространстве имен.
Кроме того, можно использовать любой из классов коллекций в пространстве имен System.Collections.Generic как строго типизированные коллекции строк, задавая класс String для аргументов универсального типа. Например, можно объявить переменную типа List<String> или Dictionary<String,String>.
LINQ to Objects и PLINQ
LINQ to Objects позволяет разработчикам использовать запросы LINQ для доступа к объектам в памяти, если тип объекта реализует IEnumerable или IEnumerable<T>. Запросы LINQ предоставляют общий шаблон для доступа к данным, обычно являются более краткими и читаемыми, чем стандартные foreach
циклы, и обеспечивают фильтрацию, упорядочивание и группирование возможностей. Дополнительные сведения см. в статьях LINQ to Objects (C#) и LINQ to Objects (Visual Basic).
PLINQ обеспечивает параллельную реализацию объектов LINQ to Objects, которые могут обеспечить более быстрое выполнение запросов во многих сценариях с помощью более эффективного использования многоядерных компьютеров. Дополнительные сведения см. в статье Parallel LINQ (PLINQ).