首先,没有循环是不可能的。该循环是否在(扩展)方法中完成无关紧要,它仍然需要一个循环。
我实际上会建议手动进行。给出的所有其他答案都需要使用两种扩展方法(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 中。