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不可行,我可以使用什么更好的方法?
从你对其他人的回答留下的评论和你的要点(链接)来看,看起来你想要解决的实际上是背包问题——特别是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);
编辑:如果需要项目的总和,可以使用Where
和Sum
扩展方法:
list.Where(p => p.Count <= 100).Sum(p => p.Count);
list.Where(p=> p.Count <= 100).ToList();