如何让含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
相关产品推荐
相关产品推荐

