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

时间:2009-04-03 07:48:45

标签: c# dictionary collections

我在C#中有两个类型为<string,object>的词典。 如何在不应用循环的情况下将一个Dictionary对象的所有内容复制到另一个?

4 个答案:

答案 0 :(得分:90)

var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);

答案 1 :(得分: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);
}

答案 2 :(得分: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;
    }
}

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

来使用它
IDictionary<string,objet> output = dictA.Merge(dictB);

我已经使该方法的行为类似于对象是不可变的,但您可以轻松修改它以不返回新的字典并且只是合并到dictA。

答案 3 :(得分:5)

var result = dictionaries.SelectMany(dict => dict)
             .ToDictionary(pair => pair.Key, pair => pair.Value);