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

C#多层嵌套类结构下BreathingZoneVentilation属性求和异常问题

问题原因

你写的求和代码核心问题是空传播运算符的隐式null处理逻辑导致大量有效求和项被忽略,具体拆解如下:

  • 你的代码中使用了链式空传播a?.AirBalance?.VentilationAirflow?.A621VentilationAirflows,只要中间任意一个属性为null,整个内层求和表达式就会返回null
  • 外层Sum针对可空double?类型的重载会自动忽略所有null值,不会抛出异常也不会计入求和
  • 如果你的多个Space对象中,只有少数(甚至只有1个)对象的所有嵌套属性都不为null,其余对象都存在某层嵌套属性为null的情况,最终的求和结果就永远等于这少数正常对象的求和值,也就是你看到的固定值1115.05
  • 额外的隐性问题:如果A621VentilationAirflows集合本身为null,你的代码中没有在A621VentilationAirflows和Sum之间加空传播,会直接抛出NullReferenceException,只是你当前的测试场景中所有集合都默认初始化所以没有触发。
修复方案

推荐使用先过滤空值再展平集合的写法,逻辑更清晰也更易排查问题:

double total = Spaces?
    // 过滤为null的Space对象
    .Where(space => space != null)
    // 取AirBalance并过滤null
    .Select(space => space.AirBalance)
    .Where(airBalance => airBalance != null)
    // 取VentilationAirflow并过滤null
    .Select(airBalance => airBalance.VentilationAirflow)
    .Where(ventilation => ventilation != null)
    // 取气流集合并过滤null集合
    .Select(ventilation => ventilation.A621VentilationAirflows)
    .Where(airflowList => airflowList != null)
    // 展平所有嵌套的气流对象集合
    .SelectMany(airflowList => airflowList)
    // 过滤为null的气流对象
    .Where(airflow => airflow != null)
    // 求和
    .Sum(airflow => airflow.BreathingZoneVentilation) ?? 0;

这种写法下如果求和结果还是不符合预期,你可以在每一步过滤后添加计数断点,快速定位是哪一层的空值过滤导致数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:54:03