Как объединить две операции Sum в одну с помощью LINQ? - PullRequest
6 голосов
/ 18 сентября 2011

У меня есть этот код

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 ]

11 голосов
/ 18 сентября 2011
var sum = 0;
var count = 0;

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

... Суть в том, зачем вообще использовать LINQ - это должно упростить некоторые вещи, но с LINQ это не так просто.

10 голосов
/ 18 сентября 2011

Вы можете сделать это с помощью 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> struct - как кортеж, но как struct.

EDIT: я согласен с точкой зрения Петара - если это all , что вам нужно сделать, то LINQ на самом деле не помогает в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...