C# 合并n个字典实例&;对重复的键执行操作

C# 合并n个字典实例&;对重复的键执行操作,c#,.net,linq,C#,.net,Linq,我想合并任意数量的字典实例,如果一个键出现多次,我想执行一个操作,例如currentResultValue+=newFoundValue 示例上下文:Map/Reduce模式,Reduce步骤,我计算了一个非常大的文本中出现的单词,并有10个映射,每个映射都返回一个字典。在reduce调用中,我现在想将所有这些字典合并为一个 输入示例: Dictionary 1: "key1" -> 5 "key2" -> 3 Dictionary 2: "key2" -&

我想合并任意数量的字典实例,如果一个键出现多次,我想执行一个操作,例如
currentResultValue+=newFoundValue

示例上下文:Map/Reduce模式,Reduce步骤,我计算了一个非常大的文本中出现的单词,并有10个映射,每个映射都返回一个
字典
。在reduce调用中,我现在想将所有这些字典合并为一个

输入示例:

Dictionary 1:
    "key1" -> 5
    "key2" -> 3

Dictionary 2:
    "key2" -> 1

Dictionary 3:
    "key1" -> 2
    "key3" -> 17
预期结果:

"key1" -> 7
"key2" -> 4
"key3" -> 17
我更喜欢基于LINQ的解决方案,例如:

IEnumerable<IDictionary<string, int>> myDictionaries = ...;
myDictionaries.Reduce((curValue, newValue) => curValue + newValue);
IEnumerable myDictionaries=。。。;
myDictionaries.Reduce((CurveValue,newValue)=>CurveValue+newValue);
我是否必须自己编写扩展方法,或者类似的方法已经存在?

var result=myDictionaries.SelectMany(x=>x)
var result = myDictionaries.SelectMany(x=>x)
                           .GroupBy(d=>d.Key)
                           .Select(g=> new KeyValuePair<string,int>(g.Key, g.Sum(x=>x.Value)))
                           .ToDictionary(k=>k.Key,v=>v.Value);
.GroupBy(d=>d.Key) .选择(g=>newkeyvaluepair(g.Key,g.Sum(x=>x.Value))) .ToDictionary(k=>k.Key,v=>v.Value);
var result=myDictionaries。选择many(x=>x)
.GroupBy(d=>d.Key)
.选择(g=>newkeyvaluepair(g.Key,g.Sum(x=>x.Value)))
.ToDictionary(k=>k.Key,v=>v.Value);
vard1=newdictionary(){{“key1”,5},{“key2”,3};
var d2=新字典(){{“key2”,1};
var d3=新字典(){{“key1”,2},{“key3”,17};
var dict=new[]{d1,d2,d3}。SelectMany(x=>x)
.GroupBy(x=>x.Key)
.ToDictionary(x=>x.Key,x=>x.Sum(y=>y.Value));
vard1=newdictionary(){{“key1”,5},{“key2”,3};
var d2=新字典(){{“key2”,1};
var d3=新字典(){{“key1”,2},{“key3”,17};
var dict=new[]{d1,d2,d3}。SelectMany(x=>x)
.GroupBy(x=>x.Key)
.ToDictionary(x=>x.Key,x=>x.Sum(y=>y.Value));

您试过这个吗?d是IDictionary类型,不提供
d.Key
属性。我同意编辑,但是,I4V的答案似乎简单了一点,这就是为什么我要接受他的答案。尽管如此,还是要为你的努力投票。@D.R.不,只要接受更好的答案,我认为
I4V
的答案非常好。你试过这个吗?d是IDictionary类型,不提供
d.Key
属性。我同意编辑,但是,I4V的答案似乎简单了一点,这就是为什么我要接受他的答案。尽管如此,还是要为你的努力投票。@D.R.不,只要接受更好的答案,我认为
I4V
的答案非常好。
var d1 = new Dictionary<string, int>() { { "key1", 5 }, { "key2", 3 } };
var d2 = new Dictionary<string, int>() { { "key2", 1 } };
var d3 = new Dictionary<string, int>() { { "key1", 2 }, { "key3", 17 } };


var dict = new[] { d1, d2, d3 }.SelectMany(x => x)
                    .GroupBy(x => x.Key)
                    .ToDictionary(x => x.Key, x => x.Sum(y => y.Value));