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


Выбор класса коллекции

Не забудьте тщательно выбрать класс коллекции. Использование неправильного типа может ограничить использование коллекции.

Это важно

Избегайте использования типов в System.Collections пространстве имен. Рекомендуется использовать универсальные и параллельные версии коллекций благодаря их улучшенной защите типов и другим усовершенствованиям.

Рассмотрим следующие вопросы:

  • Требуется ли последовательный список, в котором элемент обычно удаляется после извлечения его значения?

    • Если да, рассмотрите возможность использования Queue класса или Queue<T> обобщенного класса, если вам нужно поведение первым вошел, первым вышел (FIFO). Если требуется поведение «последний пришел, первый ушел» (LIFO), рассмотрите использование класса Stack или универсального класса Stack<T>. Для безопасного доступа из нескольких потоков используйте параллельные версии ConcurrentQueue<T> и ConcurrentStack<T>. Для неизменяемости рассмотрим неизменяемые ImmutableQueue<T> версии и ImmutableStack<T>.

    • Если нет, рассмотрите возможность использования других коллекций.

  • Необходимо ли получить доступ к элементам в определенном порядке, например, в порядке FIFO, LIFO или случайным образом?

  • Необходимо ли получить доступ к каждому элементу по индексу?

  • Будет ли каждый элемент содержать одно значение, сочетание одного ключа и одного значения или сочетание одного ключа и нескольких значений?

    • Одно значение: используйте любую из коллекций, основанных на интерфейсе IList или универсальном интерфейсе IList<T>. Для неизменяемого параметра рассмотрим универсальный IImmutableList<T> интерфейс.

    • Один ключ и одно значение: используйте любую из коллекций, основанных на интерфейсе IDictionary или универсальном интерфейсе IDictionary<TKey,TValue>. Для неизменяемого варианта рассмотрим IImmutableSet<T> или IImmutableDictionary<TKey,TValue> универсальные интерфейсы.

    • Одно значение с внедренным ключом: используйте универсальный KeyedCollection<TKey,TItem> класс.

    • Используйте класс NameValueCollection для одного ключа и нескольких значений.

  • Нужно ли отсортировать элементы по-разному от того, как они были введены?

  • Требуются ли быстрые поиски и извлечение информации?

  • Нужны ли вам коллекции, принимающие только строки?

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).

См. также