C#使用foreach遍历集合累加可空decimal值无返回结果问题求解
问题根因
C# 可空值类型(decimal? 属于 Nullable<decimal>)的运算规则为:只要任意一个操作数为 null,运算结果就为 null。你的代码中将累加变量初始值设为 null,第一次执行 += 操作时就会得到 null,后续所有累加操作结果都会保持为 null,所以最终返回空结果。
换成 = 只会保留最后一次赋值的结果,你只拿到第一条的值大概率是后续遍历的对象对应属性均为 null,覆盖后也看不出变化。
解决方案
下面给两种实现方式,按需选择即可:
方式1:修改原有foreach逻辑
如果要保留foreach写法,只需要调整初始值即可,根据业务需求选择返回规则:
规则A:列表为空/无有效数值时返回0
public decimal? ValesDisponiveis { get { decimal? informacaoRetorno = 0M; if (ValeCreditos != null) { foreach (ValeCredito vale in ValeCreditos) { // 可选:如果要跳过单个属性为null的记录可以加判断 // if(vale.ValesDisponiveis.HasValue) informacaoRetorno += vale.ValesDisponiveis; } } return informacaoRetorno; } }
规则B:列表为空/无有效数值时返回null
public decimal? ValesDisponiveis { get { if (ValeCreditos == null || !ValeCreditos.Any()) { return null; } decimal? informacaoRetorno = 0M; foreach (ValeCredito vale in ValeCreditos) { informacaoRetorno += vale.ValesDisponiveis; } // 可选:累加结果为0时也返回null // return informacaoRetorno == 0 ? null : informacaoRetorno; return informacaoRetorno; } }
方式2:用LINQ简化实现(推荐)
引入System.Linq命名空间后,直接调用Sum方法即可自动处理可空数值的累加逻辑,代码更简洁:
using System.Linq; public decimal? ValesDisponiveis { get { // ValeCreditos为null时直接返回null,否则自动累加所有ValesDisponiveis的值 return ValeCreditos?.Sum(vale => vale.ValesDisponiveis); } }
内容的提问来源于stack exchange,提问作者Favieri
相关产品推荐
相关产品推荐

