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

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

5 min read Программирование Обновлено 11 Apr 2026
C# Dictionary: создание и использование
C# Dictionary: создание и использование

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

Что такое словарь в C#?

Словарь (Dictionary) — это коллекция пар «ключ–значение», где каждый ключ уникален. Он обеспечивает эффективный доступ к значениям по ключу (обычно за амортизированное O(1)). Ключи и значения могут иметь разные типы, в том числе пользовательские классы.

Кратко:

  • Ключи должны быть уникальны и не равны 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#

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

Чтобы создать словарь, укажите типы ключа и значения в угловых скобках.

  1. Подключите пространство имён System.Collections.Generic в начале файла:
using System.Collections.Generic;
  1. Создайте экземпляр словаря (ключ — 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. Создайте словарь, где значениями будут объекты 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) { /* ... */ }

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

  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");

Если нужно сделать «обновление, если есть» — используйте 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.

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

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

Удалить геотеги на iPhone перед отправкой
Конфиденциальность

Удалить геотеги на iPhone перед отправкой

Как изменить статус в Slack
Продуктивность

Как изменить статус в Slack

Как редактировать твит в Twitter
Социальные сети

Как редактировать твит в Twitter

Как пользоваться Siri на Apple Watch
Руководство

Как пользоваться Siri на Apple Watch

Водяной знак на PDF на Mac — Automator
Mac

Водяной знак на PDF на Mac — Automator

Google Alerts: настройка и советы
Инструкции

Google Alerts: настройка и советы