Как объединить две операции 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);
Как я могу объединить их и добиться того, что коллекция перечисляется только один раз? Я нашел несколько примеров, но если я не ошибаюсь, они все еще повторяют коллекцию дважды.
2 ответов
var sum = 0;
var count = 0;
foreach(var score in scores){
sum += score.Fraction * score.Score;
count += score.Fraction;
}
... Я имею в виду, зачем вообще использовать LINQ - это должно облегчить определенные вещи, но это не легче с LINQ.
вы можете сделать это с помощью 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>
структурный кортеж, но как структура.
EDIT: я согласен с точкой Петара-если это все вам нужно сделать, тогда LINQ на самом деле не помогает в этой ситуации.