在 linq 中加入两个字典

本文关键字:两个 字典 linq | 更新日期: 2023-09-27 18:32:15

假设我有两个不同的字典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 中执行此操作?感谢您的帮助!

在 linq 中加入两个字典

以下是您可以做到这一点的方法:

var result =
    Da
    .GroupBy(x => x.Value)
    .ToDictionary(
        g => g.Key,
        g => g.Select(kvp => kvp.Key).Sum(sub => Db[sub]));

基本上,您可以按值(类似于"top1"和"top2")对Da进行分组。

然后从这样的分组中,创建一个字典。此类字典项的键将是分组的键(例如"top1")。

要计算新字典中每个项目的值,我们首先为每个组选择子,如"sub1"和"sub2",并使用Db字典获取每个项目的计数,然后计算总和。

如果Db字典实际上是Dictionary<string,int?>,则需要使用 GetValueOrDefault 方法处理null值,如下所示:

var result =
    Da
    .GroupBy(x => x.Value)
    .ToDictionary(
        g => g.Key,
        g => g.Select(kvp => kvp.Key).Sum(sub => Db[sub].GetValueOrDefault()));