LINQ: получить подмножество в зависимости от размера - PullRequest
0 голосов
/ 04 января 2012

У меня есть объект с именем Item:

public class Item
{
   public Guid Id { get; set; }
   public long Size { get; set; }       
}

в List<Item>

Мне нужно запросить этот список и вернуть количество строк, в которых накопленный размер (свойство Size элемента) не превышает определенного числа (порога).

Затем я могу обработать эти элементы, удалить их из исходного списка и получить следующий элементы с одинаковым запросом, пока все элементы не будут обработаны.

Пример списка:

Id       Size
----------------
1         10
2         13
3         5
4         30
5         10

Скажите, что мой желаемый порог - максимальный размер 25.

Запрос должен вернуть элементы с идентификатором 1 и 2, поскольку их накопленный размер не превышает 25. Затем я удаляю эти два значения. В следующий раз запрос должен вернуть 3 и 5. Идентификатор 4 никогда не должен возвращаться, так как он превышает 25.

Есть идеи?

1 Ответ

0 голосов
/ 04 января 2012

Я думаю, вам нужно сохранить какое-то значение бегущей суммы, но TakeWhile должно выполнить работу.
Примерно так:

var someValues = Enumerable.Range(0, 100);
var runningSum = 0;
var whereSumLessThan100 = someValues.TakeWhile(
    item => { runningSum += item; return runningSum < 100; }).ToList();
foreach(var item in whereSumLessThan100)
    Console.WriteLine(item);
Console.WriteLine("Sum: " + whereSumLessThan100.Sum());
...