【问题标题】:Simple Linq expression Sum - Not returning null value for empty list [duplicate]简单的 Linq 表达式 Sum - 不为空列表返回空值 [重复]
【发布时间】:2020-07-07 11:36:04
【问题描述】:

我正在为列表总和创建一个简单的测试方法,以在列表未呈现任何值时呈现 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,以防列表没有任何适当的值。我错过了什么吗?

【问题讨论】:

标签: linq sum


【解决方案1】:

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,所以我想这没关系...

【讨论】:

    猜你喜欢
    • 2016-02-06
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多