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