Объединить три словаря с Linq-Union - PullRequest
1 голос
/ 21 декабря 2010

Мне нужно объединить три словарные коллекции, если ключ один и тот же, я хочу добавить значение.

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 = (из a в d1 выберите a) .Union (из b в d2 выберите b) .GroupBy (grp => grp.Key);

1 Ответ

1 голос
/ 21 декабря 2010

Вы должны использовать Concat вместо Union.Union будет рассматривать пару ключ-значение ["one", 5] как дублированную в d1 и d3 и, следовательно, исключать один ее экземпляр, давая такой результат:

  • "one", 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));
...