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
两点:
设置属性值时,如果键位于"词典"中,则与该键关联的值将替换为指定的值.如果键不在词典中,则键和值将添加到词典中.
所以你的foreach循环基本上相当于:
foreach (var item in custom_settings)
{
   default_settings[item.Key] = item.Value;
}
Run Code Online (Sandbox Code Playgroud)
现在已经非常简洁了,所以我不认为LINQ会帮助你那么多.
这是一个很好的扩展方法,基于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)