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

如何让含null的double?列表调用Enumerable.Sum()返回null?

问题解决:让Sum在全为null的nullable序列返回null

原代码运行后输出是false,因为LINQ的Sum方法对nullable数值类型的序列有特殊处理:

var num = new List<double?>{null};  
var result = num.Sum(d => (double?)d);
Console.WriteLine(result is null); // 输出: False

要让输出变为true,有两种可行方案:

方案一:直接检查序列是否全为null

先判断列表里的元素是不是全都是null,是的话直接返回null,否则再调用Sum:

var num = new List<double?>{null};  
double? result = num.All(item => item == null) ? null : num.Sum(item => item);
Console.WriteLine(result is null); // 输出: True

方案二:自定义扩展方法(复用性更高)

写一个自己的Sum扩展方法,遍历序列时记录是否有非null元素,没有的话就返回null:

public static class EnumerableExtensions
{
    public static double? NullSafeSum(this IEnumerable<double?> source)
    {
        if (source == null)
            throw new ArgumentNullException(nameof(source));
            
        double total = 0;
        bool hasValidValue = false;
        
        foreach (var item in source)
        {
            if (item.HasValue)
            {
                total += item.Value;
                hasValidValue = true;
            }
        }
        
        return hasValidValue ? total : null;
    }
}

// 调用示例
var num = new List<double?>{null};  
var result = num.NullSafeSum();
Console.WriteLine(result is null); // 输出: True

原代码失效的原因

默认的Enumerable.Sum处理nullable序列时,会自动忽略所有null元素。如果序列里没有任何非null元素,它会返回对应数值类型的默认值(double的默认值是0),而不是我们期望的null。所以必须通过额外逻辑来覆盖这个默认行为。

内容的提问来源于stack exchange,提问作者Joe Riggs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:32:39