Что такое Dictionary в C#?

Ответ

Dictionary<TKey, TValue> — это универсальная коллекция пар "ключ-значение", которая обеспечивает очень быстрый поиск (в среднем O(1)) за счет использования хэш-таблицы.

Ключевые характеристики:

  • Уникальность ключей: Каждый ключ в словаре должен быть уникальным. Попытка добавить дубликат вызовет ArgumentException.
  • Производительность: Операции поиска, вставки и удаления выполняются за константное время в среднем случае.
  • Порядок: В классическом Dictionary порядок элементов не гарантирован. Если порядок важен, используйте SortedDictionary<TKey, TValue> или OrderedDictionary.
  • Ключи и null: Ключи ссылочного типа не могут быть null. Значения могут быть null.

Практическое использование:

// Создание и инициализация
var countryCapitals = new Dictionary<string, string>
{
    ["Россия"] = "Москва",
    ["Германия"] = "Берлин"
};

// Безопасное добавление
countryCapitals.TryAdd("Франция", "Париж");

// Безопасное получение значения (предпочтительный способ)
if (countryCapitals.TryGetValue("Россия", out string capital))
{
    Console.WriteLine(capital); // Москва
}

// Перебор элементов
foreach (KeyValuePair<string, string> kvp in countryCapitals)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}

Важные нюансы:

  1. Для пользовательских типов, используемых в качестве ключа, обязательно корректно переопределите методы GetHashCode() и Equals(). Несоблюдение этого правила приведет к некорректной работе словаря.
  2. При интенсивных операциях вставки/удаления может происходить рехеширование, что временно снижает производительность. Если размер коллекции известен заранее, укажите его в конструкторе: new Dictionary<int, string>(capacity: 1000).

Ответ 18+ 🔞

Ну ты смотри, Dictionary<TKey, TValue> — это, по сути, такая штука, где у тебя есть ключ и значение, как в обычном словаре: слово и его объяснение. И главный его козырь — скорость, блядь. Найти что-то там — это в среднем O(1), то есть почти мгновенно, потому что внутри у него хэш-таблица, которая всё и ускоряет.

Что важно помнить, чтобы не обжечься:

  • Ключи — уникальные, ёпта. Два одинаковых ключа — это как две одинаковые отмычки к одной двери, нихуя не выйдет. Попробуешь добавить второй — получишь ArgumentException прямо в ебальник.
  • Быстрый он дохуя. Искать, добавлять, удалять — всё шустро, если, конечно, ты не накосячил с хэшами (об этом ниже).
  • Порядок — похуй. В обычном Dictionary элементы могут лежать как попало. Если тебе важен порядок добавления или сортировка — смотри в сторону SortedDictionary или всяких там OrderedDictionary, там свои заморочки.
  • Ключ не может быть null. Это железное правило. А вот значение — пожалуйста, можешь хоть null туда пихать, если тебе так весело.

Как этим пользоваться, не наступая на грабли:

// Создаём и сразу пихаем данные
var страницыКниг = new Dictionary<int, string>
{
    [1] = "Жили-были дед да баба...",
    [2] = "И была у них курочка Ряба, блядь."
};

// Добавляем безопасно, чтобы не вылететь, если ключ уже есть
страницыКниг.TryAdd(3, "Снесла курочка яичко, не простое, а говно золотое.");

// Получать значения надо с умом — вот так, чтобы не получить исключение в лоб
if (страницыКниг.TryGetValue(1, out string текстСтраницы))
{
    Console.WriteLine(текстСтраницы); // Выведет про деда с бабой
}

// Пройтись по всему этому хозяйству
foreach (var пара in страницыКниг)
{
    Console.WriteLine($"Страница {пара.Ключ}: {пара.Значение}");
}

А теперь главное, где все и ебутся:

  1. Хэш-коды, мать их. Если ты используешь свои, собственноручно написанные классы в качестве ключа (не int, не string), то ты обязан, блядь, как следует переопределить методы GetHashCode() и Equals(). Иначе твой словарь превратится в тыкву — будет искать хуй пойми что, добавлять дубликаты, и вообще вести себя как пьяный мудак на корпоративе. Запомни это как «Отче наш».
  2. Ёмкость, ёпта. Если ты заранее знаешь, что сунешь в словарь овердохуища элементов, укажи это в конструкторе: new Dictionary<int, string>(capacity: 5000). Это сэкономит время на внутренних перестройках хэш-таблицы (рехешировании), когда она будет расширяться. Без этого при активном добавлении может быть небольшая просадка по скорости, пока всё внутри перетряхивается.