我有这段代码
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);
如何合并这些并实现集合只被枚举一次?我确实找到了一些例子,但如果我没有弄错,他们仍然会对该集合进行两次迭代。
答案 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>
结构 - 比如元组,但作为结构来提高效率。