Могут ли одинаковые значения использоваться в качестве ключа в словаре (Dictionary)?

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

Ответ

Нет, в стандартном Dictionary<TKey, TValue> каждый ключ должен быть уникальным. Попытка добавить запись с ключом, который уже существует, приведёт к исключению ArgumentException.

Пример ошибки:

var dict = new Dictionary<string, int>();
dict.Add("id", 1);
dict.Add("id", 2); // System.ArgumentException: An item with the same key has already been added.

Проверка и безопасное добавление: Перед добавлением следует проверять наличие ключа.

string key = "userId";
int value = 42;

if (!dict.ContainsKey(key))
{
    dict.Add(key, value);
}
// Или используйте индексер, который перезаписывает значение:
dict[key] = value; // Если ключ существовал - значение будет перезаписано.

Альтернативы для хранения нескольких значений по одному ключу: Если логика требует группировки нескольких значений, используйте словарь со списком или коллекцией.

var multiValueDict = new Dictionary<string, List<string>>();

// Вспомогательный метод для добавления
void AddToMultiDict(string key, string value)
{
    if (!multiValueDict.TryGetValue(key, out var list))
    {
        list = new List<string>();
        multiValueDict[key] = list;
    }
    list.Add(value);
}

AddToMultiDict("tags", "C#");
AddToMultiDict("tags", "dotnet");
// multiValueDict["tags"] содержит List<string> {"C#", "dotnet"}

Важно: Уникальность ключа определяется методами GetHashCode() и Equals() типа TKey. Для пользовательских типов, используемых в качестве ключа, эти методы должны быть корректно переопределены.