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

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

Внимание

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

Оцените следующие вопросы.

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

    • Если да, то рассмотрите возможность использования класса Queue или универсального класса Queue<T>, если требуется обработка по принципу "первым поступил — первым обслужен" (FIFO). Рассмотрите возможность использования класса Stack или универсального класса Stack<T>, если требуется обработка по принципу "последним поступил — первым обслужен" (LIFO). Для безопасного доступа из нескольких потоков используйте параллельные версии классов 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).

См. также