强制 linq sum 返回 null

bro*_*and 7 c# linq

我想答案很简单:

List<int?> intList = new List<int?>(){null, null, null};
int? sum = list.Sum();
int sum2 = list.Sum(a => a.HasValue ? a.Value : 0);
int sum3 = list.Sum().Value;
Run Code Online (Sandbox Code Playgroud)

Sum 总是返回 0,为什么根本需要 nullable?有没有办法强制 linq sum 返回 null?我在这里缺少什么?

fub*_*ubo 6

这是Sum()的实现

public static int? Sum(this IEnumerable<int?> source) {
if (source == null) throw Error.ArgumentNull("source");
int sum = 0;
checked {
    foreach (int? v in source) {
        if (v != null) sum += v.GetValueOrDefault();
    }
}
return sum;
Run Code Online (Sandbox Code Playgroud)

不返回 null 的原因是它的实现方式 - int sum = 0;as result的使用永远不会返回 null。

  • @omacarena 我们可以忽略空值。问题是当聚合集中没有非空值时,所有数据库 (SQL) `SUM` 返回 `NULL`,但 LINQ 返回 0(零),这是不一致的。 (2认同)

Mar*_*sch 5

正如fubo已经写的:

不返回 null 的原因是它的实现方式 - as result 的使用int sum = 0;永远不会返回 null。

为什么不编写自己的扩展方法,如下所示:

public static int? NullableSum( this IEnumerable<int?> source)
{
    int? sum = null;
    foreach (int? v in source)
    {
        if (v != null)
        {
            if (sum == null)
            {
                sum = 0;
            }

            sum += v.GetValueOrDefault();
        }
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)