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