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

时间:2011-09-18 12:11:49

标签: .net linq .net-4.0 sum

我有这段代码

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 个答案:

答案 0 :(得分:11)

var sum = 0;
var count = 0;

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

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

答案 1 :(得分: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实际上并没有帮助。