如何结合两个词典没有循环?

我在C#中有两个<string,object>types的字典。 如何将一个Dictionary对象的所有内容复制到另一个而不应用循环?

 var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value); 

你可以使用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); } 

首先,没有循环是不可能的。 这个循环是否在(扩展)方法中完成是无关紧要的,它仍然需要一个循环。

我实际上会推荐手动进行。 给出的所有其他答案需要使用两个扩展方法(Concat – ToDictionary和SelectMany – ToDictionary),从而循环两次。 如果你这样做是为了优化你的代码,那么在字典B上循环并将其内容添加到字典A会更快。

编辑:进一步调查后,Concat操作只会发生在ToDictionary调用,但我仍然认为自定义扩展方法会更有效。

如果你想减less你的代码大小,那么只需要一个扩展方法:

 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中。

 var result = dictionaries.SelectMany(dict => dict) .ToDictionary(pair => pair.Key, pair => pair.Value);