-5

我有这个数据结构:

class Product
{
    public string Name { get; set; }
    public int Count { get; set; }
}

var list = new List<Product>(){ { Name = "Book", Count = 40}, { Name = "Car", Count = 70}, { Name = "Pen", Count = 60}........... } // 500 product object


var productsUpTo100SumCountPropert = list.Where(.....) ????

// productsUpTo100SumCountPropert output:
// { { Name = "Book", Count = 40}, { Name = "Pen", Count = 60} }

我想对集合的 Count 属性求和,并仅返回该属性 Count sum 小于或等于 100 的产品对象。

如果 linq 不可能,我可以使用什么更好的方法?

4

3 回答 3

2

从您对其他人的答案和您的要点(链接)留下的评论来看,看起来您要解决的实际上是背包问题 - 特别是0/1 背包问题(链接)

关于这个主题的维基百科页面(我链接到)为您提供了一个简短的动态编程解决方案。它具有伪多项式运行时间(“伪”,因为复杂性取决于您为背包 ( W) 选择的容量。

GCD在运行算法之前要采取的一个很好的预处理步骤是找到所有项目权重 ( )的最大公分母 ( ) w_i,然后将其从每个值中除。

d <- GCD({w_1, w_2, ..., w_N})
w_i' <- w_i / d //for each i = 1, 2, ..., N
W' <- W / d //integer division here

然后使用修改后的权重和容量来解决问题(w_i'W')。

您在要点中使用的贪婪算法不会很好地工作。这种更好的算法非常简单,值得实施。

于 2013-05-21T16:37:20.383 回答
1

您需要 Count扩展方法

list.Count(p => p.Count <= 100);

编辑:

如果您想要项目的总和,Where可以Sum使用扩展方法:

list.Where(p => p.Count <= 100).Sum(p => p.Count);
于 2013-05-20T19:35:52.587 回答
0
list.Where(p=> p.Count <= 100).ToList();
于 2013-05-20T19:34:45.823 回答