【问题标题】:How to combine two dictionaries without looping?如何组合两个字典而不循环?
【发布时间】:2010-10-17 07:25:36
【问题描述】:

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

【问题讨论】:

标签: c# dictionary collections


【解决方案1】:
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);

【讨论】:

  • 这和布鲁诺的回答一模一样。
  • 对不起,但我在 bruno 更新他的答案以包括 ToDictionary 调用之前发布了 - 以前代码返回一个 IEnumerable
  • 哦,太好了!所以我被否决了,因为布鲁诺在我之后又回去更新了他的答案!
  • 检查日期,您在他编辑后 3 分钟添加了您的帖子。
  • 我似乎记得他添加 ToDictionary 调用的编辑发生在我发帖一小时后 - 但到底是什么 - 我现在已经冷静下来了,这不是世界末日:- )
【解决方案2】:

你可以使用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);
}

【讨论】:

  • 这将返回一个 IEnumerable>,你需要调用 ToDictionary 来获取字典。
【解决方案3】:

首先,没有循环是不可能的。该循环是否在(扩展)方法中完成无关紧要,它仍然需要一个循环。

我实际上会建议手动进行。给出的所有其他答案都需要使用两种扩展方法(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 中。

【讨论】:

    【解决方案4】:
    var result = dictionaries.SelectMany(dict => dict)
                 .ToDictionary(pair => pair.Key, pair => pair.Value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多