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
方法。