如何使用LINQ将两个Sum运算合并为一个?

Dab*_*rnl 6 .net linq sum .net-4.0

我有这个代码

Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score)
Dim count As Integer = scores.Sum(Function(score) score.Fraction)
Run Code Online (Sandbox Code Playgroud)

或者在C#中:

var sum=scores.Sum(score=>score.Fraction * score.Score);
var count=scores.Sum(score=>score.Fraction);
Run Code Online (Sandbox Code Playgroud)

我怎样才能合并这些并实现集合只被枚举一次?我确实找到了一些例子,但如果我没有弄错,他们仍然会对集合进行两次迭代.

Pet*_*nov 11

var sum = 0;
var count = 0;

foreach(var score in scores){
    sum += score.Fraction * score.Score;
    count += score.Fraction;
}
Run Code Online (Sandbox Code Playgroud)

......我的观点是,为什么要使用LINQ - 它意味着让某些事情变得更容易,但使用LINQ并不容易.


Jon*_*eet 10

您可以使用它Aggregate,虽然这有点痛苦 - 并为每次迭代创建一个额外的对象:

var sums = scores.Aggregate(new { Sum = 0, Count = 0 },
     (current, item) => new { Sum = current.Sum + item.Score * item.Fraction,
                              Count = current.Count  + item.Fraction });
Run Code Online (Sandbox Code Playgroud)

显然,你可以通过创建类似ValueTuple<T1, T2>结构的元组来提高效率,但是作为结构.

编辑:我同意斯托的观点-如果这是所有你需要做的,然后LINQ是不是在这种情况下,实际上是有帮助的.