用Linq-Union合并三个字典

时间:2010-12-21 19:46:22

标签: linq-to-sql dictionary 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);

Union:忽略匹配的结果集。

var uQuery =(来自d1中的a选择a).Union(来自d中的b选择b).GroupBy(grp =&gt; grp.Key);

1 个答案:

答案 0 :(得分:1)

您应该使用Concat而不是Union。 Union会将键值对[“one”,5]视为d1和d3中的重复,因此排除它的一个实例,得出以下结果:

  • “one”,5
  • “two”,30
  • “three”,7
  • “four”,2
  • “five”,8
  • “six”,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));