Словарь (Dictionary) в C#: создание, использование и лучшие практики

Что такое словарь в C#?
Словарь (Dictionary
Кратко:
- Ключи должны быть уникальны и не равны null (если используется ссылочный тип ключа, null недопустим).
- Значение может быть null.
- Типы ключа и значения задаются при создании словаря.
Пример набора пар (ключ — ID питомца, значение — имя):
{1001, "Mia"},
{1002, "Oscar"},
{1003, "Birdie"},
{1004, "Bluey"},
{1005, "Leo"},
{1006, "Travis"}Ключевые запросы (SEO)
- C# словарь
- Dictionary C# примеры
- как создать Dictionary в C#
- итерирование Dictionary C#
- обновить значение в словаре C#
Как создать словарь
Чтобы создать словарь, укажите типы ключа и значения в угловых скобках.
- Подключите пространство имён System.Collections.Generic в начале файла:
using System.Collections.Generic;- Создайте экземпляр словаря (ключ — int, значение — string):
Dictionary pets = new Dictionary(); Вы можете сразу инициализировать словарь значениями:
Dictionary pets = new Dictionary()
{
{1001, "Mia"},
{1002, "Oscar"},
{1003, "Birdie"},
{1004, "Bluey"},
{1005, "Leo"},
{1006, "Travis"}
}; Как добавить элементы в словарь
- Во время инициализации (как в примере выше).
- После создания используйте метод Add():
pets.Add(1007, "Snowy");Важно: попытка добавить ключ, который уже присутствует, вызовет ArgumentException. Для безопасной вставки используйте TryAdd (в .NET Core/5+):
if (!pets.TryAdd(1007, "Snowy"))
{
// обработка ситуации, когда ключ уже есть
}Как добавлять объекты в словарь (пример с классом Pet)

Предположим, у вас есть класс Pet. Создайте словарь, где значениями будут объекты Pet:
Dictionary petObjects = new Dictionary(); Создание объекта и добавление в словарь:
Pet mia = new Pet(1001, "Mia", new DateTime(2010, 6, 29), 9.0, new DateTime(2022, 05, 02));
petObjects.Add(1001, mia);Если не хотите бросать исключение при существующем ключе, используйте индексатор или TryGetValue/Replace-паттерн.
Как получить элемент по ключу
Доступ по ключу через индексатор возвращает значение или бросает KeyNotFoundException, если ключ не найден:
var pet = petObjects[1001];
Console.WriteLine(pet.name);Более безопасный способ — TryGetValue:
if (petObjects.TryGetValue(1001, out Pet foundPet))
{
Console.WriteLine(foundPet.name);
}
else
{
Console.WriteLine("Питомец с таким ключом не найден");
}Как итерировать словарь
Чаще всего используется foreach по паре KeyValuePair
foreach (KeyValuePair entry in petObjects)
{
// вывести ключ
Console.WriteLine(entry.Key);
// вывести имя питомца
Console.WriteLine(entry.Value.name);
} Можно итерировать только ключи (property Keys) или только значения (property Values):
foreach (int key in petObjects.Keys) { /* ... */ }
foreach (Pet p in petObjects.Values) { /* ... */ }Как обновить элемент в словаре
- Перезаписать простое значение через индексатор:
pets[1001] = "Maya";- Перезаписать объект целиком:
Pet bunny = new Pet(1001, "Bunny", new DateTime(2021, 8, 1), 3.0, new DateTime(2021, 8, 4));
petObjects[1001] = bunny;- Обновить свойство объекта в словаре (объект остаётся тем же экземпляром):
petObjects[1001].name = "Maya";
// или через сеттер
petObjects[1001].setName("Maya");Если нужно сделать «обновление, если есть» — используйте TryGetValue, затем модификацию, либо паттерн с индексатором и проверкой наличия ключа.
Как удалить элемент или очистить словарь
Удаление одного элемента по ключу:
petObjects.Remove(1002);Очистка всего словаря:
petObjects.Clear();Remove возвращает bool — true, если элемент был удалён, false если ключ не найден.
Когда словарь — хорошее решение, а когда нет
Когда использовать словарь:
- Быстрая выборка по уникальному ключу.
- У вас есть логический идентификатор (ID) или строковый ключ (например, email) для доступа к объекту.
- Большое количество записей и частые операции чтения по ключу.
Когда не подходит:
- Нужна упорядоченность по вставке — используйте OrderedDictionary или List+индексацию.
- Нужен многоточечный поиск по значению/диапазону — вместо этого подойдут B-деревья, базы данных или специализированные структуры (например, SortedList/SortedDictionary если нужен упорядоченный ключ).
- Требуется частая вставка/удаление с гарантированной балансировкой для поиска по диапазону — рассмотрите AVL или Red-Black Tree.
Альтернативы и сочетания
- SortedDictionary
: хранит ключи в порядке, используя дерево; операции ищутся за O(log n). - ConcurrentDictionary
: потокобезопасная реализация для многопоточных сценариев. - Dictionary + индексированные коллекции: если вам нужен поиск по нескольким полям, используйте несколько словарей с разными ключами.
Ментальные модели и эвристики
- Представляйте словарь как телефонную книгу по ключу: ключ — это имя контакта, значение — данные.
- Если вам нужно найти объект по его «уникальному идентификатору», словарь — первая структура для рассмотрения.
- Для операций, требующих порядка или диапазонных запросов, вспомните деревья и отсортированные коллекции.
Контрольный список для разработчика перед использованием Dictionary
- Тип ключа правильно реализует Equals и GetHashCode (особенно для пользовательских типов).
- Ключ либо немодифицируем, либо вы гарантируете, что его хэш не изменится после добавления.
- Учитывайте потокобезопасность: используйте ConcurrentDictionary для многопоточной записи.
- Обработайте потенциальные исключения при прямом доступе по индексатору.
- Подумайте о начальной ёмкости (capacity), если ожидается большое количество элементов.
Частые ошибки и как их избежать
- Изменение объектов-ключей после вставки. Хеш-код изменится — элемент потерян для поиска. Решение: использовать неизменяемые ключи или копии ключей.
- Ожидание упорядоченной коллекции. Dictionary не гарантирует порядок. Для порядка используйте SortedDictionary или List.
- Использование словаря без проверки на null ключи (если ключ — ссылочный тип).
Пример теста/критерии приёмки
- Добавление: при добавлении 100 элементов словарь должен содержать 100 элементов.
- Поиск: TryGetValue для существующего ключа возвращает true и корректное значение.
- Удаление: Remove удаляет элемент и уменьшает Count на 1.
- Конкурентность: при одновременных операциях записи/чтения без ConcurrentDictionary не гарантируется консистентность.
Глоссарий — 1 строка
- Dictionary
: коллекция пар «ключ–значение», дающая быстрый доступ по ключу.
Короткая сводка
Словарь в C# — гибкая и быстрая структура данных для задач с уникальными ключами. Вы узнали, как создавать, заполнять, читать, обновлять и удалять записи, а также альтернативы и типичные ошибки. Применяйте соответствующую реализацию (SortedDictionary, ConcurrentDictionary) в зависимости от требований к порядку и многопоточности.
Важно: при использовании пользовательских типов в качестве ключей реализуйте корректно Equals и GetHashCode.