c# Linq可以做组合运算吗?

本文关键字:运算 组合 Linq | 更新日期: 2023-09-27 18:14:45

我有这样的数据结构:

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不可行,我可以使用什么更好的方法?

c# Linq可以做组合运算吗?

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

关于这个主题的维基百科页面(我链接到的)有一个简短的动态规划解决方案。它具有伪多项式的运行时间("伪"是因为复杂度取决于你为你的背包选择的容量(W)。

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

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')来解决问题。

你在gist中使用的贪婪算法不会很好地工作。这个更好的算法非常简单,值得实现。

您需要Count扩展方法

list.Count(p => p.Count <= 100);
编辑:

如果需要项目的总和,可以使用WhereSum扩展方法:

list.Where(p => p.Count <= 100).Sum(p => p.Count);
list.Where(p=> p.Count <= 100).ToList();