C#合并2个词典

psu*_*003 20 c# linq-to-objects dictionary

我正在开发一个面向.NET 3.5的C#应用​​程序.在其中,我有2个类似的词典,其中包含我的应用程序中特定元素集的验证标准.两个词典都有相同的签名.第一个字典具有默认设置,第二个字典包含一些用户定义的设置.

var default_settings = new Dictionary<string, MyElementSettings>();
var custom_settings = new Dictionary<string, MyElementSettings>();
Run Code Online (Sandbox Code Playgroud)

我想将2个词典合并为一个包含两个词典元素的词典.

我遇到的问题是两个字典都可能具有一些相同的键值.我想要的基本规则是将两个字典组合在一起,如果default_settings中已经存在custom_settings中的任何键,则custom_settings值将覆盖default_settings值.我拥有的最佳解决方案只是一个foreach循环,检查密钥是否存在于另一个字典中,如果不存在,则添加它.

foreach (var item in custom_settings)
{
    if (default_settings.ContainsKey(item.Key))
        default_settings[item.Key] = item.Value;
    else
        default_settings.Add(item.Key, item.Value);
}
Run Code Online (Sandbox Code Playgroud)

我已经完成了一些基本的LINQ查询,但我仍在努力学习更高级的东西.我已经看到了一些将合并2个字典的查询,但大多数都涉及将任何元素与重复键分组,或者仅返回仅包含重复键的集合/是否存在将模仿foreach循环行为的LINQ查询或表达式我在用?

Ani*_*Ani 41

两点:

  1. LINQ不适合执行副作用.在这种情况下,您试图改变现有的集合而不是执行查询,所以我会回避纯粹的LINQ解决方案.
  2. 对通用字典的索引二传手已经添加键值对,如果该键不存在,或覆盖值,如果它的效果.

设置属性值时,如果键位于"词典"中,则与该键关联的值将替换为指定的值.如果键不在词典中,则键和值将添加到词典中.

所以你的foreach循环基本上相当于:

foreach (var item in custom_settings)
{
   default_settings[item.Key] = item.Value;
}
Run Code Online (Sandbox Code Playgroud)

现在已经非常简洁了,所以我不认为LINQ会帮助你那么多.

  • 第2点+1(http://msdn.microsoft.com/en-us/library/k7z0zy8k.aspx) (3认同)
  • +1 教我一些我不知道的东西。我对 C# 是相对自学的,从来不知道你可以用字典来做到这一点。 (3认同)

Dan*_*mms 9

这是一个很好的扩展方法,基于Ani的答案.

public static class DictionaryExtensionMethods
{
    public static void Merge<TKey, TValue>(this Dictionary<TKey, TValue> me, Dictionary<TKey, TValue> merge)
    {
        foreach (var item in merge)
        {
            me[item.Key] = item.Value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)