Если у нас есть класс, который содержит такое число:
class Person
{
public string Name {get; set;}
public int Amount {get; set;}
}
а затем набор людей:
IList<Person> people;
Это содержит, допустим, 10 человек случайных имен и сумм есть ли выражение Linq, которое вернет мне подколлекцию объектов Person, чья сумма удовлетворяет условию?
Например, я хочу, чтобы первые х люди, сумма которых составляла менее 1000. Я могу сделать это традиционно
var subgroup = new List<Person>();
people.OrderByDescending(x => x.Amount);
var count = 0;
foreach (var person in people)
{
count += person.Amount;
if (count < requestedAmount)
{
subgroup.Add(person);
}
else
{
break;
}
}
Но мне было интересно, есть ли элегантный способ Linq делать что-то подобное, используя Sum, а затем некоторые другие функции, такие как Take?
UPDATE
Это фантастика:
var count = 0;
var subgroup = people
.OrderByDescending(x => x.Amount)
.TakeWhile(x => (count += x.Amount) < requestedAmount)
.ToList();
Но мне интересно, могу ли я как-то изменить его дальше, чтобы захватить следующего человека в списке людей и добавить остаток в сумму, чтобы общая сумма равнялась запрашиваемой сумме.