如何在没有循环的情况下组合两个词典?

45 c# collections dictionary

<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)

  • 我似乎记得他的编辑添加了ToDictionary调用发生在我的帖子后一个小时 - 但是到底是什么 - 我现在已经平静下来并且它不是世界末日:-) (13认同)
  • 检查日期,您在编辑后3分钟添加了帖子. (2认同)

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)


Ric*_*lay 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过导入('使用')DictionaryExtensions命名空间并编写来使用它:

IDictionary<string,objet> output = dictA.Merge(dictB);
Run Code Online (Sandbox Code Playgroud)

我已经使该方法行为像对象是不可变的,但你可以很容易地修改它不返回一个新的字典,只是合并到dictA.


Kon*_*kus 5

var result = dictionaries.SelectMany(dict => dict)
             .ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)