Как добавить значение для существующего ключа в словаре на C#

#c#

Вопрос:

Приведенный ниже код пытается сохранить несколько значений для одного ключа. Мне удалось сохранить значение для несуществующего ключа. Можете ли вы подсказать мне, как я могу добавить значение для существующего ключа?

 Dictionary<string,HashSet<string>> container = new Dictionary<string,HashSet<string>>();

foreach(dynamic x in records)
{  if(!container.ContainsKey(x.code))
   {
     HashSet<string> item = new HashSet<string>();
     item.Add(x.name);
     container.Add(x.code,item);
   }
}
 

Комментарии:

1. Не то чтобы вы специально упоминали многопоточность, но стоит отметить, что это небезопасно для потоков.

2. Вы хотите только уникальное x.name ?

3. Кстати, вы, вероятно, можете сделать то же самое с records.GroupBy(r => r.code, r => r.name)

Ответ №1:

Я полагаю, это то, что вы ищете?

         Dictionary<string, HashSet<string>> container = new Dictionary<string, HashSet<string>>();
        HashSet<string> item;

        if (!container.ContainsKey(s))
        {
            item = new HashSet<string>();
            container.Add("key1", item);
        }
        else
        {
            item = container[s];
        }

        item.Add("value1");
 

Обратите внимание , что я ожидал бы , что если в словаре нет ключа s , то вы захотите добавить HashSet<string> его с тем же ключом s , нет "key1" , но это зависит от вас.

Если действительно s необходимо добавить ключ, вы можете реализовать многоразовый универсальный метод расширения:

     public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, Func<TKey, TValue> newValueFactory)
    {
        if (!dict.TryGetValue(key, out var value))
        {
            value = newValueFactory(key);
            dict.Add(key, value);
        }

        return value;
    }
 

тогда используйте его:

 container.GetOrAdd(s, _ => new HashSet<string>()).Add("value1");