Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Не забудьте тщательно выбрать класс коллекции. Использование неправильного типа может ограничить использование коллекции.
Это важно
Избегайте использования типов в 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).