我有一个元素列表,并希望获取总和(或任何元素的聚合)满足某个条件.以下代码完成了这项工作,但我很确定这不是一个不寻常的问题,应该存在适当的模式.
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
int tmp = 0;
var listWithSum = from x in list
let sum = tmp+=x
select new {x, sum};
int MAX = 10;
var result = from x in listWithSum
where x.sum < MAX
select x.x;
Run Code Online (Sandbox Code Playgroud)
有人知道如何以更好的方式解决任务,可能将TakeWhile和Aggregate合并到一个查询中吗?
谢谢
在我看来,您想要类似反应性扩展Scan(System.Interactive 部分)中的方法的东西- 它就像,但产生一个序列而不是单个结果。然后你可以这样做:Aggregate
var listWithSum = list.Scan(new { Value = 0, Sum = 0 },
(current, next) => new { Value = next,
Sum = current.Sum + next });
var result = listWithSum.TakeWhile(x => x.Sum < MaxTotal)
.Select(x => x.Value);
Run Code Online (Sandbox Code Playgroud)
(MoreLINQ有一个类似的运算符,顺便说一句 - 但目前它不支持累加器和输入序列不是同一类型的想法。)