В чем различия между Dictionary и HashSet в C#?

«В чем различия между Dictionary и HashSet в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обе коллекции используют хеш-таблицы для обеспечения высокой скорости операций (O(1) в среднем случае), но предназначены для принципиально разных задач.

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

HashSet<T> — это множество, хранящее только уникальные значения (не пары). Его цель — эффективная проверка принадлежности элемента множеству и операции над множествами (объединение, пересечение).

Наглядные примеры использования:

// Dictionary: Хранение данных с быстрым доступом по ключу (например, кэш пользователей)
var userCache = new Dictionary<int, User>();
userCache.Add(101, new User { Name = "Alice" });

// Мгновенное получение пользователя по ID
User alice = userCache[101]; // Быстрый lookup по ключу 101

// HashSet: Проверка уникальности и устранение дубликатов (например, теги статьи)
var uniqueTags = new HashSet<string>();
uniqueTags.Add("C#");
uniqueTags.Add("EF Core");
uniqueTags.Add("C#"); // Эта строка не добавится, дубликат игнорируется

// Мгновенная проверка наличия тега
bool hasEfCoreTag = uniqueTags.Contains("EF Core"); // true

// Операции с множествами
var backendTags = new HashSet<string> { "C#", "Java", "Python" };
var frontendTags = new HashSet<string> { "JavaScript", "C#" };
var commonTags = backendTags.Intersect(frontendTags); // Результат: {"C#"}

Сводная таблица различий:

Характеристика Dictionary<TKey, TValue> HashSet<T>
Структура данных Пары KeyValuePair<TKey, TValue>. Одиночные значения типа T.
Основная операция Получение значения по ключу: dict[key]. Проверка наличия элемента: set.Contains(item).
Уникальность Гарантируется уникальность ключей. Значения могут повторяться. Гарантируется уникальность всех элементов.
Индексатор Есть (dict[key]). Нет. Доступ только через методы (Add, Contains, Remove).
Использование в цикле Перебор пар KeyValuePair. Перебор значений.

Выбор в практике: Используйте Dictionary, когда вам нужен доступ к данным по уникальному идентификатору (ID, код). Используйте HashSet, когда вам важно быстро проверить, встречался ли элемент ранее, или работать с наборами уникальных данных.