Выбор класса коллекции
Обновлен: Ноябрь 2007
Необходимо тщательно выбирать ваш класс System.Collections. Использование неправильного типа может привести к ограничению возможностей использования коллекции.
Необходимо ответить на следующие вопросы:
Нужен ли последовательный список, элемент которого обычно удаляется сразу после извлечения его значения?
Если да, то рассмотрите возможность использования класса Queue или универсального класса Queue<T>, если требуется поведение по принципу "первым поступил — первым обслужен" (FIFO). Рассмотрите возможность использования класса Stack или универсального класса Stack<T>, если требуется поведение по принципу "последним поступил — первым обслужен" (LIFO).
Если нет, то следует выбирать из остальных типов коллекций.
Нужен ли доступ к элементам в определенном порядке (FIFO, LIFO) или в произвольным порядке?
Класс Queue и универсальный класс Queue<T> предоставляют доступ по принципу FIFO.
Класс Stack и универсальный класс Stack<T> предоставляют доступ по принципу LIFO.
Универсальный класс LinkedList<T> предоставляет последовательный доступ от начала к концу списка или наоборот.
Остальные коллекции предоставляют произвольный доступ.
Необходимо ли иметь доступ к каждому элементу по индексу?
Классы ArrayList и StringCollection, и универсальный класс List<T> предоставляют доступ к своим элементам по индексу с отсчетом от нуля.
Классы Hashtable, SortedList, ListDictionary и StringDictionary, а также универсальные классы Dictionary<TKey, TValue> и SortedDictionary<TKey, TValue> предоставляют доступ к своим элементам по ключу.
Классы NameObjectCollectionBase и NameValueCollection, а также универсальные классы KeyedCollection<TKey, TItem> и SortedList<TKey, TValue> предоставляют доступ к своим элементам по индексу с отсчетом от нуля или по ключу.
Будет ли каждый элемент содержать только одно значение, сочетание из одного ключа и одного значения или сочетание из одного ключа и нескольких значений?
Одно значение. Можно использовать любую из коллекций, основанных на интерфейсе 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> в качестве параметра.
Необходимы ли быстрый поиск и извлечение данных?
- ListDictionary быстрее, чем Hashtable для небольших коллекций (10 элементов или меньше). Универсальный класс Dictionary<TKey, TValue> предоставляет более быстрый просмотр, чем универсальный класс SortedDictionary<TKey, TValue>.
Нужна ли коллекция только для хранения строк?
Классы 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.Specialized