У меня есть два словаря типа <string,object>
в С#.
Как я могу скопировать все содержимое одного объекта Dictionary в другое без применения цикла?
Как объединить два словаря без циклов?
Ответ 1
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);
Ответ 2
Вы можете использовать Concat
:
Dictionary<string, object> d1 = new Dictionary<string, object>();
d1.Add("a", new object());
d1.Add("b", new object());
Dictionary<string, object> d2 = new Dictionary<string, object>();
d2.Add("c", new object());
d2.Add("d", new object());
Dictionary<string, object> d3 = d1.Concat(d2).ToDictionary(e => e.Key, e => e.Value);
foreach (var item in d3)
{
Console.WriteLine(item.Key);
}
Ответ 3
Сначала, это невозможно без цикла. Независимо от того, выполняется ли этот цикл в методе (расширения), он по-прежнему требует цикла.
Я действительно рекомендую сделать это вручную. Все остальные ответы требуют использования двух методов расширения (Concat - ToDictionary и SelectMany - ToDictionary) и, таким образом, цикл дважды. Если вы делаете это для оптимизации своего кода, быстрее будет делать цикл над словарем B и добавлять его в словарь A.
Изменить: После дальнейшего исследования операция Concat произойдет только во время вызова ToDictionary, но я по-прежнему считаю, что пользовательский метод расширения будет более эффективным.
Если вы хотите уменьшить свой размер кода, просто создайте метод расширения:
public static class DictionaryExtensions
{
public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB)
{
IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA);
foreach (KeyValuePair<TKey,TVal> pair in dictB)
{
// TODO: Check for collisions?
output.Add(pair.Key, Pair.Value);
}
return output;
}
}
Затем вы можете использовать его, импортируя ('using') пространство имен DictionaryExtensions и записывая:
IDictionary<string,objet> output = dictA.Merge(dictB);
Я сделал метод таким же, как объекты неизменяемы, но вы можете легко изменить его, чтобы не возвращать новый словарь и просто сливаться с dictA.
Ответ 4
var result = dictionaries.SelectMany(dict => dict)
.ToDictionary(pair => pair.Key, pair => pair.Value);