Словарь (Dictionary) в C#: руководство и примеры
TL;DR
Класс Dictionary

Словарь — удобная структура данных для хранения пар «ключ–значение». По ключу вы быстро получаете соответствующее значение. В C# словарь реализован в типе Dictionary
Важно: ключи в словаре должны быть уникальными. Значения могут быть любого типа, включая объекты и null (для ссылочных типов).
Зачем использовать Dictionary
- Быстрый доступ по ключу O(1) в среднем.
- Хорош для реализаций кэша, справочников, индексированных коллекций.
- Поддерживает добавление, удаление, перебор и обновление элементов.
Краткая терминология
- Ключ (Key) — уникальный идентификатор записи.
- Значение (Value) — данные, связанные с ключом.
- Пара «ключ–значение» — KeyValuePair
.
Пример: набор питомцев как словарь
Набор данных, где ключ — ID питомца, а значение — имя:
{ 1001, "Mia" },
{ 1002, "Oscar" },
{ 1003, "Birdie" },
{ 1004, "Bluey" },
{ 1005, "Leo" },
{ 1006, "Travis" }Такой набор позволяет обратиться по ключу 1003 и получить имя “Birdie”.
Как создать словарь
- Подключите пространство имён в начале файла:
using System.Collections.Generic;- Создайте пустой словарь, указав тип ключа и типа значения. В примере ключ — int, значение — string:
Dictionary pets = new Dictionary(); Как добавить элементы в словарь
Есть два основных способа: инициализация при создании и метод Add.
- Инициализация при создании словаря:
Dictionary pets = new Dictionary()
{
{1001, "Mia"},
{1002, "Oscar"},
{1003, "Birdie"},
{1004, "Bluey"},
{1005, "Leo"},
{1006, "Travis"}
}; - Добавление после создания с помощью Add:
pets.Add(1007, "Snowy");Важно: попытка добавить ключ, который уже существует, вызовет ArgumentException. Нельзя использовать null как ключ для ссылочных типов; для значений null допустим.
Как хранить объекты в словаре
Если у вас есть класс, например 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);Как получить элемент по ключу
Вы можете обратиться к значению по ключу с помощью индексатора:
var pet = petObjects[1001];
Console.WriteLine(pet.name);Если ключа нет, доступ через индексатор выбросит KeyNotFoundException. Для безопасного доступа используйте 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);
} Можно также перебирать только ключи (pets.Keys) или только значения (pets.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");Обновление по ключу заменяет прежнее значение; если ключ отсутствует, индексатор добавит новую запись.
Как удалить элементы
- Удалить одну запись по ключу:
petObjects.Remove(1002);Remove возвращает true, если удаление успешно.
- Удалить все записи:
petObjects.Clear();Лучшие практики
- Используйте TryGetValue для доступа, чтобы избежать исключений.
- Для больших наборов данных учитывайте расходы на выделение ключей: сложные ключи должны корректно реализовывать GetHashCode() и Equals().
- Для потокобезопасного доступа используйте ConcurrentDictionary
. - Не храните изменяемые объекты как ключи.
Когда Dictionary не подходит (когда это не сработает)
- Нужна упорядоченность элементов по добавлению или по ключу — рассмотрите OrderedDictionary, SortedDictionary или List.
- Требуются атомарные операции при многопоточном доступе — используйте ConcurrentDictionary.
- Ключи часто изменяются (мутабельные ключи) — это ломает хеш-таблицу.
- Требуется предсказуемое время обхода в худшем случае (хеш-коллизии) — можно рассмотреть дерево (SortedDictionary/Tree).
Альтернативы и сравнение (кратко)
- Dictionary
: быстрый доступ по ключу, не упорядочен. - SortedDictionary
: хранит элементы в отсортированном порядке по ключу, операции O(log n). - ConcurrentDictionary
: потокобезопасный словарь. - List
/ Array: когда нужен упорядоченный набор или индекс по позиции. - HashSet
: когда нужен набор уникальных значений без пар ключ–значение.
Ментальные модели и эвристики
- Представляйте словарь как телефонную книгу: имя владельца — ключ, номер телефона — значение.
- Ключи должны быть стабильными (не изменять поля, участвующие в хешировании).
- Если вы делаете тысячи обращений по ключу — словарь обычно лучший выбор.
Шпаргалка по методам (cheat sheet)
- new Dictionary
() — создать. - Add(key, value) — добавить (ошибка при дубликате).
- indexer dict[key] = value — добавить/перезаписать.
- TryGetValue(key, out value) — безопасный доступ.
- Remove(key) — удалить запись.
- Clear() — удалить все.
- ContainsKey(key) — проверка наличия ключа.
- Keys/Values — коллекции ключей и значений.
Проверочные случаи и критерии приёмки
- Добавление нового ключа успешно и доступ по нему работает.
- Попытка Add с дубликатом приводит к исключению.
- TryGetValue возвращает false для отсутствующего ключа.
- Remove возвращает true при удалении существующего ключа.
- Перебор словаря выводит все пары без дублирования ключей.
Ролевые чек-листы
Для разработчика:
- Указан правильный тип ключа и значения.
- Реализованы GetHashCode() и Equals() для пользовательских ключей.
- Используется TryGetValue для внешних вызовов.
Для ревьюера кода:
- Нет использования мутабельных объектов в качестве ключей.
- Нет подавления исключений при доступе по ключу.
- Для многопоточного доступа выбрана ConcurrentDictionary.
Краткий глоссарий
- Dictionary — словарь пар «ключ–значение».
- KeyValuePair — структура для хранения пары ключ и значение.
- Indexer — доступ через квадратные скобки dict[key].
Заключение
Словари — базовая и мощная структура данных в C#. Они подходят для большинства задач, где требуется быстрый доступ по ключу. Помните об особенностях хеширования ключей, потокобезопасности и альтернативных коллекциях для специальных требований.
Важно: для многопоточной среды используйте ConcurrentDictionary. Для упорядоченности данных — SortedDictionary или дополнительные коллекции.
Сумма: создавайте словарь, когда у вас есть уникальные идентификаторы; используйте безопасные методы доступа; выбирайте альтернативы по требованиям к упорядоченности и потокам.
Похожие материалы
Отключить автообновления приложений в Windows 10
Как остановить телефонный спам
Создать сайт на Wix — быстрый пошаговый план
Как находить новую музыку в Spotify
Как отключить Gatekeeper в macOS