Содержание
Коллекция 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# — словарь. Словарь представляет собой хэш-таблицу и позволяет с достаточно большой скоростью получать значение по ключу. При необходимости, мы можем организовать раздельные перебор только ключей или только значений из словаря.