2010-12-21 72 views
1

我需要合并三个字典集合,如果密钥相同,我想增加值。与Linq-Union合并三个字典

Result is like 
One - 5+5 =10 
two - 10+20=30 
three - 7 
four - 2 
five - 8 
six - 2 


      Dictionary<string, int> d1 = new Dictionary<string, int>(); 
      d1.Add("one", 5); 
      d1.Add("two", 10); 
      d1.Add("three", 7); 

      Dictionary<string, int> d2 = new Dictionary<string, int>(); 
      d2.Add("four", 2); 
      d2.Add("two", 20); 
      d2.Add("five", 8); 

      Dictionary<string, int> d3 = new Dictionary<string, int>(); 
      d3.Add("one", 5); 
      d3.Add("six", 2); 

联合:忽略匹配的结果集。

var uQuery =(from a in d1 select a).Union(from from b in d2 select b).GroupBy(grp => grp.Key);

回答

1

您应该使用Concat而不是Union。联盟将把键值对[“一”,5]复制在D1和D3,因此排除它的一个实例,给这样的结果:

  • “一”,5
  • “两节” ,30
  • “三”,7
  • “四”,2
  • “五”,8
  • “六”,2

var result = d1.Concat(d2.Concat(d3)).GroupBy(keyValuePair => keyValuePair.Key).ToDictionary(group => group.Key, grp => grp.Sum(kvp => kvp.Value)); 

或许更可读:

var union = d1.Concat(d2.Concat(d3)); 
var groupBy = union.GroupBy(keyValuePair => keyValuePair.Key); 
var result = groupBy.ToDictionary(group => group.Key, grp => grp.Sum(kvp => kvp.Value));