如何将两个Sum操作合并为一个使用LINQ的操作?
问题描述:
我有这样的代码如何将两个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);
如何合并这些并实现该集合只列举一次?我确实找到了一些例子,但是如果我没有弄错,他们仍然会重复收集两次。
答
var sum = 0;
var count = 0;
foreach(var score in scores){
sum += score.Fraction * score.Score;
count += score.Fraction;
}
...我的意思是,为什么使用LINQ在所有 - 它的意思是让某些事情变得更容易,但这是LINQ不容易。
答
你可以用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在这种情况下实际上并没有帮助。
我认为时尚已经让位于这里的可读性;-) – Dabblernl