C# 如何在不循环的情况下组合两个字典?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/712927/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to combine two dictionaries without looping?
提问by
I have two dictionaries of type <string,object>
in C#.
How can I copy all the contents of one Dictionary object to the other without applying a loop?
我有两个<string,object>
C#类型的字典。如何在不应用循环的情况下将一个 Dictionary 对象的所有内容复制到另一个?
回答by Konstantin Tarkus
var result = dictionaries.SelectMany(dict => dict)
.ToDictionary(pair => pair.Key, pair => pair.Value);
回答by bruno conde
You can use Concat
:
您可以使用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);
}
回答by Richard Szalay
First up, it's not possible without looping. Whether that loop is done in a (extension) method is irrelevent, it still requires a loop.
首先,没有循环是不可能的。该循环是否在(扩展)方法中完成无关紧要,它仍然需要一个循环。
I'm actually going to recommend doing it manually. All the other answers given require using two extention methods (Concat - ToDictionary and SelectMany - ToDictionary) and thus looping twice. If you are doing this to optimise your code, it will be faster to do a loop over dictionary B and add it's contents to dictionary A.
我实际上会建议手动进行。给出的所有其他答案都需要使用两种扩展方法(Concat - ToDictionary 和 SelectMany - ToDictionary),因此循环两次。如果您这样做是为了优化代码,则在字典 B 上循环并将其内容添加到字典 A 会更快。
Edit:After further investigation, the Concat operation would only occur during the ToDictionary call, but I still think a custom extension method would be more efficient.
编辑:经过进一步调查,Concat 操作只会在 ToDictionary 调用期间发生,但我仍然认为自定义扩展方法会更有效。
If you want to reduce your code size, then just make an extension method:
如果你想减少你的代码大小,那么只需创建一个扩展方法:
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;
}
}
Then you can use it by importing ('using') the DictionaryExtensions namespace and writing:
然后您可以通过导入('使用')DictionaryExtensions 命名空间并编写以下内容来使用它:
IDictionary<string,objet> output = dictA.Merge(dictB);
I have made the method act like the objects are immutable, but you could easily modify it to not return a new dictionary and just merge into dictA.
我已经使该方法表现得像对象是不可变的,但您可以轻松修改它以不返回新字典并合并到 dictA 中。
回答by Gordon Mackie JoanMiro
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);