【发布时间】:2017-01-28 07:18:22
【问题描述】:
如果我们有一个包含这样一个数字的类:
class Person
{
public string Name {get; set;}
public int Amount {get; set;}
}
然后是一群人:
IList<Person> people;
其中包含 10 个随机姓名和数量的人 是否有一个 Linq 表达式会返回一个总和满足条件的 Person 对象的子集合?
例如,我想要金额总和低于 1000 的前 x 人。 我可以通过传统方式做到这一点
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)来执行类似的操作?
更新
这太棒了:
var count = 0;
var subgroup = people
.OrderByDescending(x => x.Amount)
.TakeWhile(x => (count += x.Amount) < requestedAmount)
.ToList();
但我想知道是否可以以某种方式进一步更改它,以便抓住人员列表中的下一个人并将剩余部分添加到总和中,以便总金额等于请求的金额。
【问题讨论】:
-
people.OrderByDescending(x => x.Amount);这一行,什么都不做(usefull),因为返回的值会被排序,而不是列表本身... -
我明白,但我把它写成伪代码。抱歉,如果不清楚