Гид по технологиям

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

5 min read Программирование Обновлено 28 Dec 2025
Словарь в C# — создание и примеры
Словарь в C# — создание и примеры

TL;DR

Класс Dictionary в C# — это коллекция пар «ключ–значение» с уникальными ключами. Она обеспечивает быстрый доступ по ключу, добавление, обновление, удаление и перебор элементов. В статье приведены примеры создания словаря для простых типов и объектов, приёмы работы и рекомендации по альтернативам.

Крупный план клавиатуры компьютера с кодом на экране на заднем плане

Словарь — удобная структура данных для хранения пар «ключ–значение». По ключу вы быстро получаете соответствующее значение. В C# словарь реализован в типе Dictionary из пространства имён System.Collections.Generic.

Важно: ключи в словаре должны быть уникальными. Значения могут быть любого типа, включая объекты и null (для ссылочных типов).

Зачем использовать Dictionary

  • Быстрый доступ по ключу O(1) в среднем.
  • Хорош для реализаций кэша, справочников, индексированных коллекций.
  • Поддерживает добавление, удаление, перебор и обновление элементов.

Краткая терминология

  • Ключ (Key) — уникальный идентификатор записи.
  • Значение (Value) — данные, связанные с ключом.
  • Пара «ключ–значение» — KeyValuePair.

Пример: набор питомцев как словарь

Набор данных, где ключ — ID питомца, а значение — имя:

{ 1001, "Mia" },
{ 1002, "Oscar" },
{ 1003, "Birdie" },
{ 1004, "Bluey" },
{ 1005, "Leo" },
{ 1006, "Travis" }

Такой набор позволяет обратиться по ключу 1003 и получить имя “Birdie”.

Как создать словарь

  1. Подключите пространство имён в начале файла:
using System.Collections.Generic;
  1. Создайте пустой словарь, указав тип ключа и типа значения. В примере ключ — int, значение — string:
Dictionary pets = new Dictionary();

Как добавить элементы в словарь

Есть два основных способа: инициализация при создании и метод Add.

  1. Инициализация при создании словаря:
Dictionary pets = new Dictionary()
{
    {1001, "Mia"},
    {1002, "Oscar"},
    {1003, "Birdie"},
    {1004, "Bluey"},
    {1005, "Leo"},
    {1006, "Travis"}
};
  1. Добавление после создания с помощью Add:
pets.Add(1007, "Snowy");

Важно: попытка добавить ключ, который уже существует, вызовет ArgumentException. Нельзя использовать null как ключ для ссылочных типов; для значений null допустим.

Как хранить объекты в словаре

Если у вас есть класс, например Pet, вы можете хранить экземпляры этого класса в качестве значений.

Пример кода простого класса Pet

  1. Создайте словарь для объектов:
Dictionary petObjects = new Dictionary();
  1. Создайте объект и добавьте в словарь:
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).

Как обновить элемент

  1. Перезаписать простое значение:
pets[1001] = "Maya";
  1. Перезаписать объект целиком:
Pet bunny = new Pet(1001, "Bunny", new DateTime(2021, 8, 1), 3.0, new DateTime(2021, 8, 4));
petObjects[1001] = bunny;
  1. Изменить свойство объекта внутри словаря:
petObjects[1001].name = "Maya";
// или если есть сеттер
petObjects[1001].SetName("Maya");

Обновление по ключу заменяет прежнее значение; если ключ отсутствует, индексатор добавит новую запись.

Как удалить элементы

  1. Удалить одну запись по ключу:
petObjects.Remove(1002);

Remove возвращает true, если удаление успешно.

  1. Удалить все записи:
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 или дополнительные коллекции.

Сумма: создавайте словарь, когда у вас есть уникальные идентификаторы; используйте безопасные методы доступа; выбирайте альтернативы по требованиям к упорядоченности и потокам.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить автообновления приложений в Windows 10
Windows 10

Отключить автообновления приложений в Windows 10

Как остановить телефонный спам
Конфиденциальность

Как остановить телефонный спам

Создать сайт на Wix — быстрый пошаговый план
Веб‑сайты

Создать сайт на Wix — быстрый пошаговый план

Как находить новую музыку в Spotify
Музыка

Как находить новую музыку в Spotify

Как отключить Gatekeeper в macOS
macOS

Как отключить Gatekeeper в macOS

Как создать торрент‑файл и поделиться большим файлом
Файлообмен

Как создать торрент‑файл и поделиться большим файлом