Содержание
Коллекция Dictionary<K,V>
представляет собой так называемый словарь. В такой коллекции каждый элемент представляет собой пару «ключ — значение». Соответственно, основное назначение Dictionary<K,V>
— это получение значения по его ключу. По сути, словарь — это хэш-таблица и получение значения с помощью ключа выполняется очень быстро, близко к O (1). Скорость извлечения значения (V
) зависит от качества алгоритма хэширования для типа, указанного для ключа(K)
.
Создание и инициализация словаря в C#
Класс Dictionary
предоставляет сразу восемь различных конструкторов для создания словаря. Рассмотрим основные способы создания словаря и его наполнения данными.
Создание пустого словаря:
Dictionary<int, string> map = new Dictionary<int, string>();
здесь мы создали пустой словарь у которого в качестве ключа выступает целое число (int
), а в качестве значения — строка (string
). Теперь мы можем наполнить наш словарь данными, например, так:
map.Add(1, "Яблоко"); map.Add(2, "Апельсин"); map.Add(3, "Груша");
При этом, стоит обратить внимание на то, что ключ — это обязательно уникальное значение. Например, следующий код вызовет исключение:
map.Add(1, "Яблоко"); map.Add(1, "Апельсин");
Создание и инициализация словаря значениями:
Dictionary<int, string> map = new Dictionary<int, string>() { { 1, "Яблоко"}, { 2, "Апельсин"}, { 3, "Груша"} };
Здесь, в фигурных скобках мы указываем пары «ключ-значение». Так как ключом у нас выступает тип int
, то, соответственно, и при наполнении словаря, вначале идёт ключ, а, затем, значение элемента.
Также, аналогичный вариант инициализации:
Dictionary<int, string> map = new Dictionary<int, string>() { [1] = "Яблоко", [2] = "Апельсин", [3] = "Груша" };
здесь в квадратных скобках указывается ключ, а далее, после знака равенства (=
) — значение.
Перебор словаря
Перебор элементов в цикле foreach
Самый простой способ перебора элементов словаря — в цикле foreach
:
foreach (var fruit in map) { Console.WriteLine($"Ключ {fruit.Key} значение {fruit.Value}"); }
при этом каждый элемент словаря будет представлять из себя экземпляр структуры KeyValuePair<TKey, TValue>
или, если быть точным, в нашем примере — это KeyValuePair<int, string>
. После того, как мы получили очередной элемент словаря, мы можем получить значения его полей Key
и Value
.
Получение значений всех ключей и значений элементов
Все значения ключей словаря содержатся в свойстве KeyCollection
. В примере ниже показано, как можно перебрать все значения ключей словаря:
Dictionary<int, string> map = new Dictionary<int, string>() { [1] = "Яблоко", [2] = "Апельсин", [3] = "Груша" }; //получае коллекцию ключей Dictionary<int, string>.KeyCollection keys = map.Keys; Console.WriteLine($"Количество ключей {keys.Count}"); //перебираем значения ключей foreach (int key in keys) { Console.WriteLine(key); }
Аналогичным образом можно получить доступ к коллекции значений и перебрать их в цикле:
Dictionary<int, string>.ValueCollection values = map.Values; foreach (string value in values) { Console.WriteLine(value); }
Доступ к элементам словаря по значению ключа
Рассмотренные выше примеры работы с элементами словаря не раскрывают основного назначения этого типа данных, а именно — получение значения по ключу. Рассмотрим следующий пример:
Dictionary<int, string> map = new Dictionary<int, string>() { [1] = "Яблоко", [2] = "Апельсин", [3] = "Груша" }; for (int i = 0; i < 5; i++) { string value = map.GetValueOrDefault(i); if (value == null) Console.WriteLine($"В словаре нет значения соответствующего ключу {i}"); else Console.WriteLine(value); }
В результате, в консоли мы увидим следующий вывод:
Яблоко
Апельсин
Груша
В словаре нет значения соответствующего ключу 4
Этот же пример мы могли бы переписать и следующим образом:
for (int i = 0; i < 5; i++) { if (map.TryGetValue(i, out string value)) Console.WriteLine(value); else Console.WriteLine($"В словаре нет значения соответствующего ключу {i}"); }
Результат будет тот же, что и в примере выше.
Методы Dictionary
Ниже в таблице представлены основные методы, реализованные в классе Dictionary
Add(TKey, TValue) |
Добавляет указанные ключ и значение в словарь. |
Clear() |
Удаляет все ключи и значения из словаря Dictionary<TKey,TValue> . |
Contains |
Определяет, содержится ли указанный ключ в словаре Dictionary<TKey,TValue> . |
Contains |
Определяет, содержит ли коллекция Dictionary<TKey,TValue> указанное значение. |
Remove(TKey) |
Удаляет значение с указанным ключом из словаря Dictionary<TKey,TValue> . |
Try |
Получает значение, связанное с заданным ключом. |
Итого
Сегодня мы рассмотрели ещё одну структуру данных в C# — словарь. Словарь представляет собой хэш-таблицу и позволяет с достаточно большой скоростью получать значение по ключу. При необходимости, мы можем организовать раздельные перебор только ключей или только значений из словаря.