В пространстве имен System.Collections.Generic
имеется очень интересный класс Dictionary (словарь).
Как и все коллекции, в том числе и обобщенные, позволяет работать с переменным
количеством внутренних переменных. Главной отличительной особенностью списка
Dictionary от списка List
заключается в том, что элементы в Dictionary
представлены парой Ключ/значение, где каждому ключу соответствует значение.
Если мы рассматриваем способ хранения элементов в типе List,
то у каждого элемента внутри списка имеется ссылка на следующий элемент. Этот факт
позволяет быстро и легко проходить по списку в одном направлении, определяя следующий
элемент для перемещения динамически в текущем элементе. В итоге нет необходимости
задумываться о полном количестве элементов в списке и нет необходимости определять
на каком текущем элементе в данный момент находишься.
В отличие от List, Dictionary получает доступ к элементу по его ключу.
Синтаксически это выглядит так:
Dictionary myDict;
где тип ключа и значения указывается при создании экземпляра Dictionary.
К примеру, создадим список, представляющий средний балл за семестр каждого студента,
где имя студента представлено ключом, средний бал - значением для этого ключа:
Dictionary avgStud =
new Dictionary();
Теперь следует заполнить данную коллекцию. Учтите, что тип Dictionary
не может содержать в себе два одинаковых ключа!
Добавление элементов выполняется методом Add, причем желательно предусмотреть перехват исключения
ArgumentException, сигнализирующее о том, что была предпринята попытка
добавления значения с уже существующим ключом:
try
{
avgStud.Add(“Петров”, 3,45);
avgStud.Add(“Иванов”, 4,7);
avgStud.Add(“Сидоров”, 4,03);
}
catch(ArgumentException e)
{
Console.WriteLine(“Элемент с данным ключом уже имеется”);
}
Поскольку класс Dictionary<Tkey, Tvalue>
реализован как хэш-таблица, извлечение значений по его ключу происходит очень быстро.
Попробуем пройтись, даже пробежаться по элементам нашей коллекции avgStud:
foreach (KeyValuePair kvp in avgStud)
{
Console.WriteLine(kvp.Key + "->" + kvp.Value);
}
Заметьте, что текущий элемент итерации представляет собой экземпляр типа KeyValuePair.
Еще одним полезным методом является метод Remove(TKey key). Данный метод удаляет элемент из коллекции по его ключу:
avgStud.Remove(“Иванов”);
Метод возвращает тип bool (true, если элемент был найден
и успешно удален из коллекции и false, если элемент не был найден).
В следующей статье мы поговорим об обобщенном списке List.