I have the following code which is working:
IEnumerable<Decimal?> values = getValues();
var sum = values.Where(x => x > 0).Sum();
But if I try:
var sum = values.Sum(x => x > 0);
I get the error:
Cannot implicitly convert type 'bool' to 'long?'
Shouldn't this work either applying the filter in Sum or Where?
Indeed, Sum requires numbers values and not boolean evaluation results.
You need first to filter using Where or Select (not relevant here) then Sum:
var sum = values.Where(x => x != null && x > 0).Sum();
I added the null check because the collection is type of decimal?
.
Else you need to write that but this is less speed optimized:
var sum = values.Sum(x => x != null && x > 0 ? x : 0);
Using a selector for Sum is for example usefull when having classes, structs or tuples:
var sum = controls.Sum(control => control.Width);