Словарь Dictionary в C#

Коллекция 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, "Апельсин");
System.ArgumentException: «An item with the same key has already been added. Key: 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);

}

В результате, в консоли мы увидим следующий вывод:

В словаре нет значения соответствующего ключу 0
Яблоко
Апельсин
Груша
В словаре нет значения соответствующего ключу 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>.
ContainsKey(TKey) Определяет, содержится ли указанный ключ в словаре Dictionary<TKey,TValue>.
ContainsValue(TValue) Определяет, содержит ли коллекция Dictionary<TKey,TValue> указанное значение.
Remove(TKey) Удаляет значение с указанным ключом из словаря Dictionary<TKey,TValue>.
TryGetValue(TKey, TValue) Получает значение, связанное с заданным ключом.

Итого

Сегодня мы рассмотрели ещё одну структуру данных в C# — словарь. Словарь представляет собой хэш-таблицу и позволяет с достаточно большой скоростью получать значение по ключу.  При необходимости, мы можем организовать раздельные перебор только ключей или только значений из словаря.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии