Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq取决于元素的总和(或聚合)_C#_Linq_Aggregate - Fatal编程技术网

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

C# Linq取决于元素的总和(或聚合),c#,linq,aggregate,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,

我有一个元素列表,并希望在元素和(或元素的任何聚合)满足某个条件时使用它。下面的代码完成了这项工作,但我非常确定这不是一个不寻常的问题,应该存在一个合适的模式

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;
var list=新列表{1,2,3,4,5,6,7};
int-tmp=0;
var listWithSum=从列表中的x开始
设和=tmp+=x
选择新的{x,sum};
int MAX=10;
var结果=从列表中的x开始
其中x.sum
有人知道如何以更好的方式解决任务吗?可能是将TakeWhile和Aggregate组合到一个查询中


Thx

在我看来,您似乎希望从(System.Interactive部分)中获得类似于
扫描的方法-它类似于
聚合
,但会产生一个序列而不是单个结果。然后你可以做:

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);
var listWithSum=list.Scan(新的{Value=0,Sum=0},
(当前,下一个)=>new{Value=next,
总和=当前值。总和+下一个});
var result=listWithSum.TakeWhile(x=>x.Sumx.Value);

(有一个,顺便说一句-但目前它不支持累加器和输入序列不是同一类型的想法。)

我很清楚,不应该修改变量作为查询的副作用。如果两次使用listWithSum,如果在这两次使用之间未初始化tmp,则会导致不同的结果。这就是为什么我确信这个解决方案是一个糟糕的解决方案的原因之一!var list=新列表{1,2,3,4,5,6,7};int-tmp=0;int MAX=10;var result2=list.TakeWhile(x=>{tmp+=x;返回tmp