我<string,object>在C#中有两个类型的字典.如何在不应用循环的情况下将一个Dictionary对象的所有内容复制到另一个;
Gor*_*iro 91
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);
Run Code Online (Sandbox Code Playgroud)
bru*_*nde 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);
}
Run Code Online (Sandbox Code Playgroud)
首先,没有循环就不可能.该循环是否在(扩展)方法中完成是无关紧要的,它仍然需要循环.
我实际上会建议手动完成它.给出的所有其他答案都需要使用两种扩展方法(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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以通过导入('使用')DictionaryExtensions命名空间并编写来使用它:
IDictionary<string,objet> output = dictA.Merge(dictB);
Run Code Online (Sandbox Code Playgroud)
我已经使该方法行为像对象是不可变的,但你可以很容易地修改它不返回一个新的字典,只是合并到dictA.
var result = dictionaries.SelectMany(dict => dict)
.ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)