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
相关产品推荐
相关产品推荐

