You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字典结果转换为元组并按指定键过滤(C#)

解决方案

可以通过模式匹配结合临时变量的方式,将字典生成与过滤逻辑合并为单条语句,直接返回包含两个列表的元组,同时保持和原代码一致的null处理逻辑:

var (proposedEnergies, baselineEnergies) = (BenchmarkingModeledEnergyItems
    ?.GroupBy(o => o.BenchmarkingEnergyModelTypeId)
    .ToDictionary(o => o.Key, 
                  o => o.Select(p => new Energy
                  {
                      Unit = energyUnitById[p.Energy.UnitId],
                      Scalar = p.Energy.Scalar
                  }).ToList())) is var energyDict 
    ? (energyDict.GetValueOrDefault(benchmarkingEnergyModelTypeIdByName["Proposed"]), 
       energyDict.GetValueOrDefault(benchmarkingEnergyModelTypeIdByName["Baseline"])) 
    : (null, null);

逻辑说明

  1. 先执行原有的字典生成逻辑,通过is var模式匹配将结果赋值给临时变量energyDict
  2. 判断字典是否为null:
    • 若字典不为null,用GetValueOrDefault方法获取指定键对应的列表(和原代码TryGetValue效果一致,键不存在时返回null)
    • 若字典为null,直接返回(null, null),和原代码中字典为null时的结果一致

如果你的项目支持扩展方法,也可以用Let扩展方法让代码更简洁:

首先定义扩展方法:

public static class Extensions
{
    public static TOut Let<TIn, TOut>(this TIn input, Func<TIn, TOut> func)
    {
        return func(input);
    }
}

然后合并语句可以写成:

var (proposedEnergies, baselineEnergies) = BenchmarkingModeledEnergyItems
    ?.GroupBy(o => o.BenchmarkingEnergyModelTypeId)
    .ToDictionary(o => o.Key, 
                  o => o.Select(p => new Energy
                  {
                      Unit = energyUnitById[p.Energy.UnitId],
                      Scalar = p.Energy.Scalar
                  }).ToList())
    ?.Let(dict => (
        dict.GetValueOrDefault(benchmarkingEnergyModelTypeIdByName["Proposed"]),
        dict.GetValueOrDefault(benchmarkingEnergyModelTypeIdByName["Baseline"])
    )) ?? (null, null);

内容的提问来源于stack exchange,提问作者kumar425

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:55:16