当我们使用int?
或decimal?
等可空类型时,Sum(a+b)
有时会与Sum(a)+Sum(b)
不同
工作示例:
class SomeClass
{
public int? One { get; set; }
public int? Two { get; set; }
}
static void Main(string[] args)
{
var list = new List<SomeClass>()
{
new SomeClass { One = 1, Two = 2 },
new SomeClass { One = 1, Two = 2 },
new SomeClass { One = 1, Two = 2 },
new SomeClass { One = 1, Two = 2 },
new SomeClass { Two = 2 }
};
Console.WriteLine(list.Sum(_ => _.One + _.Two)); // 12 // wrong
Console.WriteLine(list.Sum(_ => _.One) + list.Sum(_ => _.Two)); // 14
Console.ReadLine();
}
可以预期两个总和(打印在Console
上)都会写出14
。但似乎第一个忽略了一些元素。
答案 0 :(得分:1)
那只是因为最后一个元素:
new SomeClass { Two = 2 }
没有One
,在这种情况下,One
为null
,null+a
为a
,非null
整数为{{1} }}
现在Linq.Sum
中指定,总和忽略null
值。因此,最后一项不计算在内。
在第二个版本中没有遇到此问题,因为null
之后的总和将对除最后一个项目之外的所有项目求和,而One
s上的总和将对所有项目求和。“ p>
正如@Chris所说,你确实可以使用Null coalescing operator Two
。如果One ?? 0
为0
,则此运算符返回One
,在这种情况下,即使其中一个参数为null
,它也将归零,从而返回一个数字