我有一个元素列表,想要取和(或元素的任何聚合)满足特定条件的同时。下面的代码完成了这项工作,但我很确定这不是一个应该存在适当模式的异常问题。
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;
有人知道如何以更好的方式解决任务,可能将 TakeWhile 和 Aggregate 结合到一个查询中吗?
谢谢
最佳答案
在我看来,您想要类似 Reactive Extensions 中的 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);
( MoreLINQ 有一个 similar operator ,顺便说一句 - 但目前它不支持累加器和输入序列不是同一类型的想法。)
关于c# - Linq TakeWhile 取决于元素的总和(或聚合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699075/