C# 为什么在使用LINQ Sum方法时出现异常“无法将类型'bool'隐式转换为'long?”,以及如何修复它?

C# 为什么在使用LINQ Sum方法时出现异常“无法将类型'bool'隐式转换为'long?”,以及如何修复它?,c#,linq,sum,numbers,decimal,C#,Linq,Sum,Numbers,Decimal,我有以下正在运行的代码: IEnumerable<Decimal?> values = getValues(); var sum = values.Where(x => x > 0).Sum(); 我得到一个错误: Cannot implicitly convert type 'bool' to 'long?' 这不应该在Sum或Where中应用过滤器吗?确实,Sum需要数字值,而不是布尔计算结果 您首先需要使用或不使用此处的相关内容进行筛选,然后: 我添加了空检查

我有以下正在运行的代码:

IEnumerable<Decimal?> values = getValues();

var sum = values.Where(x => x > 0).Sum();
我得到一个错误:

Cannot implicitly convert type 'bool' to 'long?'

这不应该在Sum或Where中应用过滤器吗?

确实,Sum需要数字值,而不是布尔计算结果

您首先需要使用或不使用此处的相关内容进行筛选,然后:

我添加了空检查,因为集合的类型是decimal

否则您需要编写,但速度优化程度较低:

var sum = values.Sum(x => x != null && x > 0 ? x : 0);
例如,当具有类、结构或元组时,使用for Sum非常有用:

var sum = controls.Sum(control => control.Width);

事实上,求和需要的是数值,而不是布尔计算结果

您首先需要使用或不使用此处的相关内容进行筛选,然后:

我添加了空检查,因为集合的类型是decimal

否则您需要编写,但速度优化程度较低:

var sum = values.Sum(x => x != null && x > 0 ? x : 0);
例如,当具有类、结构或元组时,使用for Sum非常有用:

var sum = controls.Sum(control => control.Width);
此代码:

var sum = values.Sum(x => x > 0);
包括返回布尔真或假的lambda表达式匿名函数。这与:

var sum = values.Sum(x => Check(x));

private bool Check(long x)
{
    return x > 0;
}
由于不能对布尔值求和,因此代码不起作用。如果传递了Sum,则参数期望该参数是int或long数字的枚举,例如,尽管它有许多重载。

此代码:

var sum = values.Sum(x => x > 0);
包括返回布尔真或假的lambda表达式匿名函数。这与:

var sum = values.Sum(x => Check(x));

private bool Check(long x)
{
    return x > 0;
}
由于不能对布尔值求和,因此代码不起作用。如果传递了Sum,则参数期望该参数是int或long数字的枚举,例如,尽管它有许多重载。

正如您可以看到的Enumerable。Sum没有接受布尔返回Func作为参数的重载。它只有接受返回代理数的重载

那有什么用

假设您在购物车中有一个物品列表,并且您想要计算总价,您可以这样做:

var totalPrice = cartItems.Sum(ci => ci.Price);
如果要首先筛选它,必须使用Where.

,因为您可以看到Enumerable.Sum没有接受布尔返回Func作为参数的重载。它只有接受返回代理数的重载

那有什么用

假设您在购物车中有一个物品列表,并且您想要计算总价,您可以这样做:

var totalPrice = cartItems.Sum(ci => ci.Price);

如果要首先筛选它,必须使用Where。

Sum expects谓词和返回值编号,x>0是布尔值传递给Sum的Func参数是选择器,而不是筛选器。Sum expects谓词和返回值编号,x>0是布尔值传递给Sum的Func参数是选择器,不是过滤器。我无法解释总和中的lambda表达式。现在我明白了。。。Sum func就像一个Select@MiguelMoura这是正确的,我没有用SUM解释lambda表达式。现在我明白了。。。Sum func就像一个Select@MiguelMoura这就是简单的var sum=controls.Sumx=>x*2;作为用例?您是否运行了速度比较来支持该声明?@Filburt如果您使用10的条件对10项、5个正项和5个负项进行求和,并将其变为0,则比仅添加从该条件中选择的5项要慢。x*2示例暗示了该声明,它仅对类、结构或元组有用。@Filburt确实,是的,简单地说var sum=controls.Sumx=>x*2;作为用例?您是否运行了速度比较来支持该声明?@Filburt如果您使用10的条件对10项、5个正项和5个负项进行求和,并将其变为0,则比仅添加从该条件中选择的5项要慢。x*2示例暗示了该声明,它仅对类、结构或元组有用。@Filburt确实,没错。