Linq:如何查询集合中的项目,直到总和达到某个值

时间:2009-10-30 21:20:43

标签: c# linq

给出以下对象:

public class Product {
   string Name {get;} 
   int Quantity {get;}
}

使用Linq,在获得给定数量的总和List<Product>之前,如何查询>=?换句话说,如果我的列表看起来像

Name     Quantity
-----------------
prod1       5
prod2       6
prod7       7

我想查询List并拉出实例,直到得到Sum >=8。在这种情况下,我将获得列表中的前两项。如果我想要总和>= 12,我会得到所有三个。

我知道我可以写一个循环为我做这个,但我想幻想有一些光滑的单行使用Linq实现同样的事情。

由于

2 个答案:

答案 0 :(得分:19)

这是一个快速的2线。

var sum = 0;
var query = col.Where(x => { var temp = sum; sum += x.Quantity; return temp < 500; });

将500替换为您选择的常量或变量。

修改

这是mquander更有效的解决方案

var sum = 0;
var query = col.TakeWhile(x => { var temp = sum; sum += x.Quantity; return temp < 500; });

答案 1 :(得分:1)

您只需创建一个变量来保存总和,然后添加到该变量,因为列表中的每个项目都使用where子句进行测试:

int sum = 0;
from product in list where (sum += product.Quantity) < 8 select product