Linq TakeWhile取决于元素的总和(或聚合)

Mar*_*ser 5 c# linq aggregate

我有一个元素列表,并希望获取总和(或任何元素的聚合)满足某个条件.以下代码完成了这项工作,但我很确定这不是一个不寻常的问题,应该存在适当的模式.

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合并到一个查询中吗?

谢谢

Jon*_*eet 2

在我看来,您想要类似反应性扩展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有一个类似的运算符,顺便说一句 - 但目前它不支持累加器和输入序列不是同一类型的想法。)