Linq: как запрашивать элементы из коллекции, пока сумма не достигнет определенного значения

Учитывая следующий объект:

public class Product {
   string Name {get;} 
   int Quantity {get;}
}

используя Linq, как бы я запросил List<Product>, пока не получил сумму >= данной величины? Другими словами, если бы мой список выглядел как

Name     Quantity
-----------------
prod1       5
prod2       6
prod7       7

Я хочу запросить список и вытащить экземпляры, пока не получу Sum >=8. В этом случае я получу первые два элемента в Списке. Если бы мне нужна сумма >= 12, я бы получил все три.

Я знаю, что могу написать цикл, чтобы сделать это для меня, но я фантазировал о том, что для достижения той же цели был какой-то гладкий однострочный Linuer.

Спасибо

Ответ 1

Вот быстрая 2 лайнера.

var sum = 0;
var query = col.Where(x => { var temp = sum; sum += x.Quantity; return temp < 500; });

Замените 500 константой или переменной по вашему выбору.

ИЗМЕНИТЬ

Вот более эффективное решение mquander

var sum = 0;
var query = col.TakeWhile(x => { var temp = sum; sum += x.Quantity; return temp < 500; });

Ответ 2

Вы просто создаете переменную для хранения суммы, а затем добавляете ее, поскольку каждый элемент в списке проверяется с помощью предложения where:

int sum = 0;
from product in list where (sum += product.Quantity) < 8 select product