假设我有两个不同的词典Dictionary<string,string> Da
和Dictionary<string,int> Db
Db保存子级别项目的计数
var Db = new Dictionary<string,int?>{{"sub1",10},{"sub2",30},{"sub3",70}...};
其中Da包含子级到顶级的映射:
var Da = new Dictionary<string,string>{{"sub1","top1"},{"sub2","top1"},{"sub3","top2"}};
如果我想汇总最高级别的数字,
{{"top1",40},{"top2",70}...}
我如何在linq中解决这个问题?谢谢你的帮助!
答案 0 :(得分:4)
以下是如何做到这一点:
var result =
Da
.GroupBy(x => x.Value)
.ToDictionary(
g => g.Key,
g => g.Select(kvp => kvp.Key).Sum(sub => Db[sub]));
基本上,您将Da
分组为值(类似于&#34; top1&#34;&#34; top2&#34;)。
然后从这样的分组中,您创建一个字典。这些字典项的关键是分组的关键(例如&#34; top1&#34;)。
要计算新词典中每个项目的值,我们首先选择每个组的子项,例如&#34; sub1&#34;和&#34; sub2&#34;并使用Db
字典获取每个字典的计数,然后计算总和。
如果Db
字典实际上是Dictionary<string,int?>
,那么您需要使用null
方法处理GetValueOrDefault
值,如下所示:
var result =
Da
.GroupBy(x => x.Value)
.ToDictionary(
g => g.Key,
g => g.Select(kvp => kvp.Key).Sum(sub => Db[sub].GetValueOrDefault()));