Обобщенные коллекции

57

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

Пройди тесты
Лучший чат для C# программистов