我认为答案是微不足道的:
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?我在这里缺少什么?
答案 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;