如何使用LINQ将两个求和操作合并为一个?

6

我有这段代码

Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score)
Dim count As Integer = scores.Sum(Function(score) score.Fraction)

或者使用C#:

var sum=scores.Sum(score=>score.Fraction * score.Score);
var count=scores.Sum(score=>score.Fraction);

如何合并它们并实现只枚举集合一次?我找到了一些示例,但如果我没记错的话,它们仍然会两次迭代集合。
2个回答

11
var sum = 0;
var count = 0;

foreach(var score in scores){
    sum += score.Fraction * score.Score;
    count += score.Fraction;
}

我的观点是,为什么要使用LINQ - 它的目的是使某些事情更简单,但是在这种情况下并没有变得更简单。


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 });

显然,你可以通过创建一个ValueTuple<T1, T2>结构体来使其更有效 - 就像元组一样,但是作为一个结构体。

编辑:我同意Petar的观点 - 如果这是你需要做的全部,那么LINQ在这种情况下实际上并不会有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接