Linq Sum(a + b)与Sum(a)+ Sum(b)不同

时间:2015-01-06 16:46:19

标签: c# linq

当我们使用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。但似乎第一个忽略了一些元素。

1 个答案:

答案 0 :(得分:1)

那只是因为最后一个元素:

new SomeClass { Two = 2 }

没有One,在这种情况下,Onenullnull+aa,非null整数为{{1} }}

现在Linq.Sum中指定,总和忽略null值。因此,最后一项不计算在内。

在第二个版本中没有遇到此问题,因为null之后的总和将对除最后一个项目之外的所有项目求和,而One s上的总和将对所有项目求和。“ p>

正如@Chris所说,你确实可以使用Null coalescing operator Two。如果One ?? 00,则此运算符返回One,在这种情况下,即使其中一个参数为null,它也将归零,从而返回一个数字