Обобщенные коллекции
57C# --- Руководство по C# --- Обобщенные коллекции
Благодаря внедрению обобщений прикладной интерфейс Collections API значительно расширился, в результате чего количество классов коллекций и интерфейсов удвоилось. Обобщенные коллекции объявляются в пространстве имен System.Collections.Generic. Как правило, классы обобщенных коллекций являются не более чем обобщенными эквивалентами классов необобщенных коллекций, хотя это соответствие не является взаимно однозначным. Например, в классе обобщенной коллекции LinkedList реализуется двунаправленный список, тогда как в необобщенном эквиваленте его не существует. В некоторых случаях одни и те же функции существуют параллельно в классах обобщенных и необобщенных коллекций, хотя и под разными именами. Так, обобщенный вариант класса ArrayList называется List, а обобщенный вариант класса HashTable — Dictionary. Кроме того, конкретное содержимое различных интерфейсов и классов реорганизуется с минимальными изменениями для переноса некоторых функций из одного интерфейса в другой. Но в целом, имея ясное представление о необобщенных коллекциях, можно без особого труда научиться применять и обобщенные коллекции.
Как правило, обобщенные коллекции действуют по тому же принципу, что и необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций. А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций.
Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы.
Интерфейсы обобщенных коллекций
В пространстве имен System.Collections.Generic определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций:
- ICollection<T>
Определяет основополагающие свойства обобщенных коллекций
- IComparer<T>
Определяет обобщенный метод Compare() для сравнения объектов, хранящихся в коллекции
- IDictionary<Tkey, TValue>
Определяет обобщенную коллекцию, состоящую из пар "ключ-значение"
- IEnumerable<T>
Определяет обобщенный метод GetEnumerator(), предоставляющий перечислитель для любого класса коллекции
- IEnumerator<T>
Предоставляет методы, позволяющие получать содержимое коллекции по очереди
- IEqualityComparer<T>
Сравнивает два объекта на предмет равенства
- IList<T>
Определяет обобщенную коллекцию, доступ к которой можно получить с помощью индексатора
Структура KeyValuePair<TKey, TValue>
В пространстве имен System.Collections.Generic определена структура KeyValuePair<TKey, TValue> Она служит для хранения ключа и его значения и применяется в классах обобщенных коллекций, в которых хранятся пары "ключ-значение", как, например, в классе Dictionary<TKey, TValue> В этой структуре определяются два следующих свойства:
public ТКеу Key { get; };
public TValue Value { get; };
В этих свойствах хранятся ключ и значение соответствующего элемента коллекции. Для построения объекта типа KeyValuePair<TKey, TValue> служит конструктор:
public KeyValuePair(ТКеу key, TValue value)
где key обозначает ключ, a value — значение.
Классы обобщенных коллекций
Kлассы обобщенных коллекций по большей части соответствуют своим необобщенным аналогам, хотя в некоторых случаях они носят другие имена. Отличаются они также своей организацией и функциональными возможностями. Классы обобщенных коллекций определяются в пространстве имен System.Collections.Generic:
- Dictionary<Tkey, TValue>
Сохраняет пары "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс Hashtable
- HashSet<T>
Сохраняет ряд уникальных значений, используя хештаблицу
- LinkedList<T>
Сохраняет элементы в двунаправленном списке
- List<T>
Создает динамический массив. Обеспечивает такие же функциональные возможности, как и необобщенный класс ArrayList
- Queue<T>
Создает очередь. Обеспечивает такие же функциональные возможности, как и необобщенный класс Queue
- SortedDictionary<TKey, TValue>
Создает отсортированный список из пар "ключ-значение"
- SortedList<TKey, TValue>
Создает отсортированный список из пар "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс SortedList
- SortedSet<T>
Создает отсортированное множество
- Stack<T>
Создает стек. Обеспечивает такие же функциональные возможности, как и необобщенный класс Stack
В пространстве имен System.Collections.Generic находятся также следующие классы: класс SynchronizedCollection<T> синхронизированной коллекции на основе класса IList<T>; класс SynchronizedReadOnlyCollection<T>, доступной только для чтения синхронизированной коллекции на основе класса IList<T>; абстрактный класс SynchronizedKeyCollection<K, Т>, служащий в качестве базового для класса коллекции System.ServiceModel.UriSchemeKeyedCollection; а также класс KeyedByTypeCollection<T> коллекции, в которой в качестве ключей используются отдельные типы данных.