2011-09-18 35 views
6

我有这样的代码如何将两个Sum操作合并为一个使用LINQ的操作?

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

如何合并这些并实现该集合只列举一次?我确实找到了一些例子,但是如果我没有弄错,他们仍然会重复收集两次。

回答

11
var sum = 0; 
var count = 0; 

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

...我的意思是,为什么使用LINQ在所有 - 它的意思是让某些事情变得更容易,但这是LINQ不容易。

+0

我认为时尚已经让位于这里的可读性;-) – Dabblernl

10

你可以用Aggregate做到这一点,虽然这是一个有点痛 - 并为每个迭代一个额外的对象:通过创建一个ValueTuple<T1, T2>结构

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

显然,你能做出这样更有效率 - 像元组,但作为一个结构。

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

相关问题