2010-12-21 71 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));