Linq TakeWhile в зависимости от суммы (или совокупности) элементов - PullRequest
5 голосов
/ 23 апреля 2010

У меня есть список элементов, и я хочу взять, пока сумма (или любая совокупность элементов) удовлетворяет определенному условию.Следующий код выполняет свою работу, но я уверен, что это не необычная проблема, для которой должен существовать правильный шаблон.

var list = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
int tmp = 0;
var listWithSum = from x in list
                  let sum = tmp+=x
                  select new {x, sum};
int MAX = 10;
var result = from x in listWithSum
             where x.sum < MAX
             select x.x;

Кто-нибудь знает, как лучше решить задачу, возможно, объединяя TakeWhile и Aggregate в один запрос?

Thx

1 Ответ

2 голосов
/ 23 апреля 2010

Мне кажется, что вы хотите что-то вроде Scan метода из Reactive Extensions (часть System.Interactive) - это похоже на Aggregate, но выдает последовательность вместо одного результата.Затем вы можете сделать:

var listWithSum = list.Scan(new { Value = 0, Sum = 0 },
         (current, next) => new { Value = next,
                                  Sum = current.Sum + next });

var result = listWithSum.TakeWhile(x => x.Sum < MaxTotal)
                        .Select(x => x.Value);

( MoreLINQ имеет аналогичный оператор , кстати - но в настоящее время он не поддерживает идею аккумулятора и входной последовательностине того же типа.)

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