使用 Linq-Union 合并三个字典

发布于 2024-10-08 13:19:18 字数 771 浏览 2 评论 0原文

我需要合并三个字典集合,如果键相同我想添加值。

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(从 d2 中的 b 选择 b).GroupBy(grp=>grp.Key );

i need to merge three dictionary collection, if key is same i want to add value.

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: ignore the matching resultset.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤独岁月 2024-10-15 13:19:18

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

  • "one", 5
  • "two", 30
  • "third", 7
  • "four ”, 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));

You should use Concat instead of Union. Union will treat the key value pair ["one", 5] as duplicated in d1 and d3, and therefore exclude one instance of it, giving this result:

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

or perhaps more readably:

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));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文