使用C#中的lambdas检查LINQ Sum()方法内的值

时间:2011-05-12 14:59:35

标签: c# linq sum

我必须求和一个对象中的所有值。从数据库中检索值并将其存储在List<T>中。如果其中一个值等于-1,我想在总和中使用0。

以下是我用来执行任务的代码:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m => new
{
    Monthly_ActualValue = (m.Monthly_ActualValue != -1) ? 
      m.Monthly_ActualValue : 0F
});

Monthly_ActualValue 的类型为浮动?。编译器给出了一个错误,指出我无法将匿名类型转换为浮动?。这很奇怪,因为我在Select子句中使用相同的代码而没有收到任何错误。 可能是什么问题?

由于

弗朗西斯

4 个答案:

答案 0 :(得分:7)

您正在使用new {}关键字和括号创建一个新的匿名类型,它永远不会转换为浮点数。如果你想要求和是一个浮点数,删除匿名类型声明,只需指定生成浮点数的表达式,如下所示:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m => (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F);

答案 1 :(得分:4)

问题是你使用new { ... }创建一个匿名类型没有特别明显的原因...... Sum不知道如何添加匿名类型的值尝试这个:

lprod_projectionActualvalue = lprod_monthlyReport
    .Sum(m => m.Monthly_ActualValue != -1 ? m.Monthly_ActualValue : 0F);

使用可空类型魔法“不计数”值(-1)让我感到有些惊讶。通常你只需要其中一个选项 - 但我会接受你的意思,这真的是你想要的:)

(我建议你看一下.NET naming conventions ......这些下划线不是常规的,我不清楚lprod的意思。只是一般建议。)

答案 2 :(得分:1)

我会先尝试添加一个select,然后调用Sum方法

lprod_projectionActualvalue = lprod_monthlyReport.Select(m => new
{
    Monthly_ActualValue = (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F
}).Sum(m => m.Monthly_ActualValue);

答案 3 :(得分:1)

你的lambda没有返回float。它声明了一个具有单个float属性Monthly_ActualValue的新匿名类型。您不能Sum此类型的对象,因为没有为其定义添加。

请改为尝试:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m =>
    (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F
);