C# 给定两个词典,如何覆盖其中一个词典中的匹配项和另一个词典中的匹配项,而保持其余项不变

C# 给定两个词典,如何覆盖其中一个词典中的匹配项和另一个词典中的匹配项,而保持其余项不变,c#,.net,c#-4.0,.net-4.0,C#,.net,C# 4.0,.net 4.0,以下是起始代码: Dictionary<string,object> dest=...; IDictionary<string,object> source=...; // Overwrite in dest all of the items that appear in source with their new values // in source. Any new items in source that do not appear in dest should

以下是起始代码:

Dictionary<string,object> dest=...;
IDictionary<string,object> source=...;

// Overwrite in dest all of the items that appear in source with their new values
// in source. Any new items in source that do not appear in dest should be added.
// Any existing items in dest, that are not in source should retain their current 
// values.
...
Dictionary dest=。。。;
IDictionary源=。。。;
//在dest中覆盖源中显示的所有项及其新值
//来源。应添加源中未出现在dest中的任何新项。
//dest中任何不在源中的现有项都应保留其当前项
//价值观。
...
显然,我可以通过一个
foreach
循环来完成这项工作,该循环遍历源代码中的所有项,但是在C#4.0(可能是LINQ)中是否有一些速记方法来完成这项工作


谢谢

foreach的
非常小。为什么要把事情复杂化

foreach(var src in source)
{
    dest[src.Key] = src.Value;
}

如果要经常重复此操作,可以编写一个扩展方法:

public static void MergeWith<TKey, TValue>(this Dictionary<TKey,TValue> dest, IDictionary<TKey, TValue> source)
{
    foreach(var src in source)
    {
        dest[src.Key] = src.Value;
    }
}

//usage:
dest.MergeWith(source);
publicstaticvoidmergewith(此Dictionary dest,IDictionary源代码)
{
foreach(源中的var src)
{
dest[src.Key]=src.Value;
}
}
//用法:
目的地合并(来源);


至于“使用LINQ”,查询部分意味着LINQ方法应该没有副作用。对于我们这些不希望有副作用的人来说,产生副作用常常令人困惑。

foreach的
foreach
非常小。为什么要把事情复杂化

foreach(var src in source)
{
    dest[src.Key] = src.Value;
}

如果要经常重复此操作,可以编写一个扩展方法:

public static void MergeWith<TKey, TValue>(this Dictionary<TKey,TValue> dest, IDictionary<TKey, TValue> source)
{
    foreach(var src in source)
    {
        dest[src.Key] = src.Value;
    }
}

//usage:
dest.MergeWith(source);
publicstaticvoidmergewith(此Dictionary dest,IDictionary源代码)
{
foreach(源中的var src)
{
dest[src.Key]=src.Value;
}
}
//用法:
目的地合并(来源);


至于“使用LINQ”,查询部分意味着LINQ方法应该没有副作用。对我们这些不希望有副作用的人来说,产生副作用常常令人困惑。

这一次相当难看,但它确实起到了作用:

source.All(kv => { dest[kv.Key] = kv.Value; return true; });

这一个相当难看,但它起作用了:

source.All(kv => { dest[kv.Key] = kv.Value; return true; });

我只是希望有一些速记方法,仅此而已。提出的扩展方法似乎是这个问题的最佳解决方案,所以我给你打勾…我只是希望有一些速记方法,仅此而已。提出的扩展方法似乎是这个问题的最佳解决方案,所以我给你打勾…不客气:-)我倾向于同意@Austin,不过,最好避免LINQ表达式中的副作用。
All
用于确定每个项目是否符合条件。在这种情况下,您可以用几乎任何LINQ方法替换它;您要做的只是使用
ForEach
方法。让每个人都更容易,只需使用foreach循环。至少,使用
ForEach
扩展方法,而不是
All
,因为它更具误导性。我之所以给这个a+1,是因为它说明了一个人必须经历的扭曲,以及编写
Merge
扩展方法的理由。@Servy:因为LINQ不提供内置的
ForEach
方法,我假设您指的是用户提供的扩展方法。我想Austin的方法正好符合这个目的。许多人在每个项目中都这样做,或者使用
列表。ForEach
方法。不客气:-)我倾向于同意@Austin,不过,可能最好避免LINQ表达式中的副作用。
All
用于确定每个项目是否满足条件。在这种情况下,您可以用几乎任何LINQ方法替换它;您要做的只是使用
ForEach
方法。让每个人都更容易,只需使用foreach循环。至少,使用
ForEach
扩展方法,而不是
All
,因为它更具误导性。我之所以给这个a+1,是因为它说明了一个人必须经历的扭曲,以及编写
Merge
扩展方法的理由。@Servy:因为LINQ不提供内置的
ForEach
方法,我假设您指的是用户提供的扩展方法。我想奥斯汀的方法正好符合这个目的,很多人在每个项目中都这样做,或者使用
List.ForEach
方法。