Simple Linq表达式Sum-不为空列表返回null值



我正在创建一个简单的测试方法,当列表没有呈现任何值时,列表的总和将呈现为null

[Fact]
public void GetSum()
{
List<TestClass> list = new List<TestClass>();
list.Add(new TestClass
{
Amount = null,
Id = 1
});
list.Add(new TestClass
{
Amount = null,
Id = 0
});
IQueryable<TestClass> classes = list.AsQueryable();

var sum = classes.AsEnumerable().Where(i => i.Id > 1).Select(i => i.Amount).Sum();
var sum1 = classes.AsEnumerable().Sum(i => i.Amount);
Assert.NotNull(sum);
}
#endregion Impact Ratio
}
public class TestClass
{
public int Id { get; set; }
public double? Amount { get; set; }
}

sum和sum1都呈现0,我希望它们为null,以防列表没有任何合适的值。我遗漏了什么吗?

Sum()函数的工作原理与此相同,因此您必须使用另一个函数来实现您想要的功能。一种可能性是Aggregate()函数,它允许您定义求和的工作方式。

例如,这似乎实现了您想要的:

[Fact]
public void GetSum()
{
var classes = new[]
{
new TestClass {Amount = null, Id = 1},
new TestClass {Amount = 1, Id = 0}
};
var sum1 = classes.Where(i => i.Id > 1)
.Select(i => i.Amount)
.Aggregate((double?)null, (a, b) => a.HasValue && b.HasValue ? a + b : a ?? b);
var sum2 = classes.Select(i => i.Amount)
.Aggregate((double?)null, (a, b) => a.HasValue && b.HasValue ? a + b : a ?? b);
Assert.Null(sum1);
Assert.NotNull(sum2);
}

注意,这个方法只在有IEnumerable的情况下有效-它不适用于IQueryable,但在您自己的例子中,您可以将IQueryable转换为IEnumerable,所以我想这是可以的…

最新更新