强制linq sum返回null

时间:2017-04-21 07:58:29

标签: 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;

总和总是返回0,为什么需要可以为空?有没有办法强制linq sum返回null?我在这里缺少什么?

5 个答案:

答案 0 :(得分:3)

以下是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;

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

答案 1 :(得分:1)

它只是匹配输入类型的类型。如果将列表更改为List,则返回int not int ?,因为列表是int?这就是它返回的......

答案 2 :(得分:1)

你可以试试这个:

int? sum = intList.TrueForAll(x => x == null) ? null : intList.Sum();

答案 3 :(得分:0)

正如fubo已经写道:

  

不返回null的原因是它实现的方式 - 使用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;
}

答案 4 :(得分:0)

如果你的linq总和返回null,你也可以试试这个:

int? sum = intList.AsQueryable().Any(a => a.HasValue) ? intList.AsQueryable().Sum(a => a.Value) : (int?)null;