Коллекции С#: реализация интерфейсов для сортировки элементов.
Программные объекты в языке C# могут объединяться в коллекции. Благодаря коллекциям возможна эффективная групповая обработка объектов (причем, необязательно однотипных). Наиболее востребованы в программах коллекции обобщенного и необобщенного типа.
Необобщенные коллекции соответствуют ряду типовых структур данных, к которым относятся:
- Динамический массив ArrayList, способный, подобно контейнеру vector в STL, увеличивать свой размер при необходимости;
- хеш-таблицу для пар "ключ-значение” Hashtable;
- очередь Queue, работающая по принципу FIFO ("первым пришел — первым вышел");
- отсортированный список пар "ключ-значение" SortedList, являющийся аналогом контейнера map в STL;
- стек Stack, реализующий обработку по принципу LIFO )"первым пришел — последним вышел").
Особенность необобщенных коллекций заключается в том, что они хранят данные в виде ссылок на тип Object. Так как этот тип данных является базовым для всех типов CLS, в необобщенные коллекции можно объединять данные любого типа.
Функциональность необобщенных коллекций декларируется специализированными интерфейсами [4](см. таблицу 4).
Таблица 4. Интерфейсы необобщенных коллекций
Интерфейс | Описание |
ICollection | Определяет элементы, которые должны иметь все необобщенные коллекции |
IComparer | Определяет метод Compare() для сравнения объектов, хранящихся в коллекции |
IDictionary | Определяет коллекцию, состоящую из пар "ключ-значение" |
IDictionaryEnumerator | Определяет перечислитель для коллекции, реализующей интерфейс IDictionary |
IEnumerable | Определяет метод GetEnumerator (), предоставляющий перечислитель для любого класса коллекции |
IEnumerator | Предоставляет методы, позволяющие получать содержимое коллекции по очереди |
IEqualityComparer | Сравнивает два объекта на предмет равенства |
IList | Определяет коллекцию, доступ к которой можно получить с помощью индексатора |
IStructuraIComparable | Определяет метод CompareTo(), применяемый для структурного сравнения |
IStructuralEquatable | Определяет метод Equals(), применяемый для выяснения структурного, а не ссылочного равенства. Кроме того, определяет метод GetHashCode() |
Классы и интерфейсы необобщенных коллекций находятся в пространстве имен System.Collections.
Обобщенные коллекции реализуют принцип обобщенного программирования для стандартных структур данных, в том числе имеющих реализации в виде необобщенных коллекций. Обобщенные коллекции (таблица 5) обеспечивают безопасность типизации, поскольку могут хранить объекты лишь одного типа данных.
Таблица 5. Обобщенные коллекции языка C#
Обобщенная коллекция | Описание |
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 |