在linq中加入两个词典

时间:2016-01-27 22:22:22

标签: c# linq

假设我有两个不同的词典Dictionary<string,string> DaDictionary<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中解决这个问题?谢谢你的帮助!

1 个答案:

答案 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()));