如何将字典结果转换为元组并按指定键过滤(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);
逻辑说明
- 先执行原有的字典生成逻辑,通过
is var模式匹配将结果赋值给临时变量energyDict - 判断字典是否为null:
- 若字典不为null,用
GetValueOrDefault方法获取指定键对应的列表(和原代码TryGetValue效果一致,键不存在时返回null) - 若字典为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
相关产品推荐
相关产品推荐

