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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:39:02