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


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

Обновлен: Ноябрь 2007

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

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

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

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

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

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

    • Класс Queue и универсальный класс Queue<T> предоставляют доступ по принципу FIFO.

    • Класс Stack и универсальный класс Stack<T> предоставляют доступ по принципу LIFO.

    • Универсальный класс LinkedList<T> предоставляет последовательный доступ от начала к концу списка или наоборот.

    • Остальные коллекции предоставляют произвольный доступ.

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

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

    • Одно значение. Можно использовать любую из коллекций, основанных на интерфейсе 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

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

См. также

Ссылки

System.Collections

System.Collections.Specialized

System.Collections.Generic

Другие ресурсы

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