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


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

Следует тщательно выбирать класс коллекции. Использование неправильного типа может привести к ограничению возможностей использования коллекции. В общем случае не следует использовать типы в пространстве имен System.Collections, если явным образом не нужна платформа .NET Framework версии 1.1. Предпочитаются универсальная и параллельная версии коллекции, так как они обладают большей типобезопасностью и содержат другие улучшения.

Необходимо ответить на следующие вопросы:

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

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

    • Если нет, то следует выбирать из остальных типов коллекций.

  • Нужен ли доступ к элементам в определенном порядке (FIFO, LIFO) или в произвольным порядке?

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

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

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

    • Один ключ и одно значение. Можно использовать любую из коллекций, основанных на интерфейсе IDictionary или на универсальном интерфейсе IDictionary<TKey, TValue>.

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

    • Один ключ и несколько значений. Можно использовать класс NameValueCollection.

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

    • Класс Hashtable сортирует свои элементы по их хэш-коду.

    • Класс SortedList и универсальные классы SortedDictionary<TKey, TValue> и SortedList<TKey, TValue> сортируют свои элементы по их ключам на основе реализации интерфейса IComparer и универсального интерфейса IComparer<T>.

    • ArrayList предоставляет метод Sort, который принимает реализацию IComparer в качестве параметра. Его универсальный аналог — универсальный класс List<T> предоставляет метод Sort, который принимает реализацию универсального интерфейса IComparer<T> в качестве параметра.

  • Необходимы ли быстрый поиск и извлечение данных?

  • Нужна ли коллекция только для хранения строк?

    • Классы StringCollection (основанный на IList) и StringDictionary (основанный на IDictionary) находятся в пространстве имен System.Collections.Specialized.

    • Кроме того, можно использовать любой из универсальных классов коллекций в пространстве имен System.Collections.Generic как строго типизированную строковую коллекцию, указав класс String в качестве аргумента универсального типа.

LINQ to Objects и PLINQ

LINQ to Objects позволяет разработчикам использовать LINQ запросы для доступа к объектам в памяти, если объект типа реализует IEnumerable или IEnumerable<T>. LINQ запросы предоставляют общий шаблон для доступа к данным, являются более четкими и удобочитаемыми, чем стандартные циклы foreach, а также предоставляют возможности фильтрации, сортировки и группировки. Дополнительные сведения см. в разделе LINQ to Objects.

Язык PLINQ предоставляет параллельную реализацию языка LINQ to Objects, которая может предложить более быстрое выполнение запросов во многих сценариях за счет более эффективного использования многоядерных компьютеров. Дополнительные сведения см. в разделе Parallel LINQ (PLINQ).

См. также

Ссылки

System.Collections

System.Collections.Specialized

System.Collections.Generic

Основные понятия

Управление коллекциями и их создание

Потокобезопасные коллекции