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

标签 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;

有人知道如何以更好的方式解决任务,可能将 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/

相关文章:

c# - 在 LINQ 查询中使用动态数据类型

c# - 对 varchar 字段的 linq 查询不返回任何结果

node.js - Mongodb聚合传递匹配的数组和不匹配的数组

c# - asp.net中的多行输入用于编辑数据库表

c# - 如何获取作为另一个元素后代的多个 XML 元素

c# - 检查列表是否包含两个不同派生类型的元素

r - 按时间间隔聚合一个数据帧与另一个数据帧

MongoDB $lookup 管道 : does this use indexes?

c# 通过系统扬声器发出哔哔声 - 直接访问 sys.扬声器

c# - 如何使用 csharp 向 Microsoft Teams channel 发送简单消息?