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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 22:04:39  来源:igfitidea点击:

How to combine two dictionaries without looping?

c#dictionarycollections

提问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);