Dab*_*rnl 6 .net linq sum .net-4.0
我有这个代码
Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score)
Dim count As Integer = scores.Sum(Function(score) score.Fraction)
Run Code Online (Sandbox Code Playgroud)
或者在C#中:
var sum=scores.Sum(score=>score.Fraction * score.Score);
var count=scores.Sum(score=>score.Fraction);
Run Code Online (Sandbox Code Playgroud)
我怎样才能合并这些并实现集合只被枚举一次?我确实找到了一些例子,但如果我没有弄错,他们仍然会对集合进行两次迭代.
Pet*_*nov 11
var sum = 0;
var count = 0;
foreach(var score in scores){
sum += score.Fraction * score.Score;
count += score.Fraction;
}
Run Code Online (Sandbox Code Playgroud)
......我的观点是,为什么要使用LINQ - 它意味着让某些事情变得更容易,但使用LINQ并不容易.
Jon*_*eet 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 });
Run Code Online (Sandbox Code Playgroud)
显然,你可以通过创建类似ValueTuple<T1, T2>结构的元组来提高效率,但是作为结构.
编辑:我同意斯托的观点-如果这是所有你需要做的,然后LINQ是不是在这种情况下,实际上是有帮助的.