我在C#中有两个类型为<string,object>
的词典。
如何在不应用循环的情况下将一个Dictionary对象的所有内容复制到另一个?
答案 0 :(得分:90)
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);
答案 1 :(得分:42)
您可以使用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);
}
答案 2 :(得分:9)
首先,没有循环就不可能。该循环是否在(扩展)方法中完成是无关紧要的,它仍然需要一个循环。
我实际上会建议手动执行此操作。给出的所有其他答案都需要使用两种扩展方法(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;
}
}
然后您可以通过导入('使用')DictionaryExtensions命名空间并编写:
来使用它IDictionary<string,objet> output = dictA.Merge(dictB);
我已经使该方法的行为类似于对象是不可变的,但您可以轻松修改它以不返回新的字典并且只是合并到dictA。
答案 3 :(得分:5)
var result = dictionaries.SelectMany(dict => dict)
.ToDictionary(pair => pair.Key, pair => pair.Value);