Полное руководство по языку программирования С# 14 и платформе .NET 10 / Коллекции

Коллекция Dictionary

Начальный ⏱ 5 мин чтения 👁 2 🕓 обновлено 11.08.2026

Еще один распространенный тип коллекции представляют словари. Словарь хранит объекты, которые представляют пару ключ-значение. Класс словаря Dictionary<K, V> типизируется двумя типами: параметр K представляет тип ключей, а параметр V предоставляет тип значений.

Создания и инициализация словаря

Класс Dictionary предоставляет ряд конструкторов для создания словаря. Например, мы можем создать пустой словарь:


Dictionary<int, string> people = new Dictionary<int, string>();

Здесь словарь people в качестве ключей принимает значения типа int, а в качестве значений - строки.

При определении словаря его сразу же можно инициализировать значениями:


var people = new Dictionary<int, string>()
{
    { 5, "Tom"},
    { 3, "Sam"},
    { 11, "Bob"}
};

При инициализации применяется инициализитор - в фигурных скобках после вызова конструктора объекту передаются начальные данные. В случае со словаем мы можем передать в инициализаторе набор элементов, где каждый элемент заключается в фигурные скобки, например:

{ 5, "Tom"}

Каждый элемент представляет два значения: первое значение представляет ключ, а второе значение - собственно значение элемента. Поскольку при объявлении словаря people для ключей указан тип int, а для значений - тип string, то в элементе словаря сначала указывается число int, а затем строка. То есть в случае выше элемент имеет ключ 5, а значение - "Tom". Затем по ключу элемента мы сможем получить его значение.

Также мы можем применять другой способ инициализации:


var people = new Dictionary<int, string>()
{
    [5] = "Tom",
    [6] = "Sam",
    [7] = "Bob"
};  

При таком способе инициализации в квадратных скобках указывается ключ и ему присваивается значение элемента. Но в целом этот способ инициализации будет равноценен предыдущему.

KeyValuePair

Стоит отметить, что каждый элемент в словаре представляет структуру KeyValuePair<TKey, TValue>, где параметр TKey представляет тип ключа, а параметр TValue - тип значений элементов. Эта структура предоставляет свойства Key и Value, с помощью которых можно получить соответственно ключ и значение элемента в словаре. И одна из версий конструктора Dictionary позволяет инициализировать словарь коллекцией объектов KeyValuePair:


var mike = new KeyValuePair<int, string>(56, "Mike"); 
var employees = new List<KeyValuePair<int, string>>() { mike};
var people = new Dictionary<int, string>(employees);

Конструктор типа KeyValuePair принимает два параметра - ключ элемента и его значения. То есть в данном случае создается один такой элемент - mike с ключом 56 и значением "Mike". И этот элемент добавляется в список employees, которым затем инициализируется словарь.

Можно совместить оба способа инициализации:


var mike = new KeyValuePair<int, string>(56, "Mike");
var employees = new List<KeyValuePair<int, string>>() { mike };
var people = new Dictionary<int, string>(employees)
{
    [5] = "Tom",
    [6] = "Sam",
    [7] = "Bob",
};

В данном случае в словаре people будет четыре элемента.

Перебор словаря

Для перебора словаря можно применять цикл foreach:


var people = new Dictionary<int, string>()
{
    [5] = "Tom",
    [6] = "Sam",
    [7] = "Bob"
};
foreach(var person in people)
{
    Console.WriteLine($"key: {person.Key}  value: {person.Value}");
}

При переборе каждый элемент будет помещаться в переменную, которая представляет тип KeyValuePair, соответственно с помощью свойств Key и Value мы сможем получить ключ и значение элемента. Консольный вывод программы:


key: 5  value: Tom
key: 6  value: Sam
key: 7  value: Bob

Поскольку тип KeyValuePair позволяет выполнить деконструкцию объекта, то мы можем при переборе словаря сразу же разложить объект на свойства:


var people = new Dictionary<int, string>()
{
    [5] = "Tom",
    [6] = "Sam",
    [7] = "Bob"
};
foreach (var (key, val) in people)  // раскладываем объект на свойства
{
    Console.WriteLine($"key: {key}  value: {val}");
}

Получение элементов

Для обращения к элементам из словаря применяется их ключ, который передается в квадратных скобках:

словарь[ключ]

Таким образом мы можем получить и изменить элементы словаря


var people = new Dictionary<int, string>()
{
    [5] = "Tom",
    [6] = "Sam",
    [7] = "Bob",
};
// получаем элемент по ключу 6
string sam = people[6];  // Sam
Console.WriteLine(sam);  // Sam
// переустанавливаем значение по ключу 6
people[6] = "Mike";
Console.WriteLine(people[6]);  // Mike

// добавляем новый элемент по ключу 22
people[22] = "Eugene";
Console.WriteLine(people[22]);  // Eugene

Более того, таким образом мы можем также добавить новый элемент в словарь. При установке значения по ключу, если элемент с таким ключом уже есть в словаре, то значение переустанавливается. Если же элемента с подобным ключом нет в словаре, то элемент добавляется.:

Методы и свойства Dictionary

Среди методов класса Dictionary можно выделить следующие:

  • void Add(K key, V value): добавляет новый элемент в словарь

  • void Clear(): очищает словарь

  • bool ContainsKey(K key): проверяет наличие элемента с определенным ключом и возвращает true при его наличии в словаре

  • bool ContainsValue(V value): проверяет наличие элемента с определенным значением и возвращает true при его наличии в словаре

  • bool Remove(K key): удаляет по ключу элемент из словаря

    Другая версия этого метода позволяет получить удленный элемент в выходной параметр: bool Remove(K key, out V value)

  • bool TryGetValue(K key, out V value): получает из словаря элемент по ключу key. При успешном получении передает значение элемента в выходной параметр value и возвращает true

  • bool TryAdd(K key, V value): добавляет в словарь элемент с ключом key и значением value. При успешном добавлении возвращает true

Из свойств следует отметить свойство Count, которое возвращает количество элементов в словаре.

Применение методов:


// условная телефонная книга
var phoneBook = new Dictionary<string, string>();

// добавляем элемент: ключ - номер телефона, значение - имя абонента
phoneBook.Add("+123456", "Tom");
// альтернативное добавление
// phoneBook["+123456"] = "Tom";

// Проверка наличия
var phoneExists1 = phoneBook.ContainsKey("+123456");    // true
Console.WriteLine($"+123456: {phoneExists1}");
var phoneExists2 = phoneBook.ContainsKey("+567456");    // false
Console.WriteLine($"+567456: {phoneExists2}");
var abonentExists1 = phoneBook.ContainsValue("Tom");      // true
Console.WriteLine($"Tom: {abonentExists1}");
var abonentExists2 = phoneBook.ContainsValue("Bob");      // false
Console.WriteLine($"Bob: {abonentExists2}");

// удаление элемента
phoneBook.Remove("+123456");

// проверяем количество элементов после удаления
Console.WriteLine($"Count: {phoneBook.Count}"); // Count: 0

Проверь себя

📋 Тест по теме «Коллекция Dictionary» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____<int, string> people = new Dictionary<int, string>();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var people = _____ Dictionary<int, string>()
{
    { 5, "Tom"},
    { 3, "Sam"},
    { 11, "Bob"}
};
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

{ _____, "Tom"}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var people = new Dictionary<int, string>()
{
    [_____] = "Tom",
    [6] = "Sam",
    [7] = "Bob"
};
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var mike = new KeyValuePair<int, string>(56, "_____"); 
var employees = new List<KeyValuePair<int, string>>() { mike};
var people = new Dictionary<int, string>(employees);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

Dictionary<int, string> _____ = _____ Dictionary<int, string>();
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

var people = new Dictionary<int, string>()
{
    { 5, "_____"},
    { 3, "_____"},
    { 11, "Bob"}
};
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

    { 3, "Sam"},
    { 11, "Bob"}
{
};
var people = new Dictionary<int, string>()
    { 5, "Tom"},
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Коллекция Dictionary»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Коллекция Dictionary», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

Dictionary<int, string> people = new Dictionary<int, string>();
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Коллекция Dictionary»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

var people = new Dictionary<int, string>()
{
    { 5, "Tom"},
    { 3, "Sam"},
    { 11, "Bob"}
};
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Коллекция Dictionary»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Коллекция Dictionary»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Коллекция Dictionary». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.