Как объединить две операции 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 на самом деле не помогает в этой ситуации.