【问题标题】:Could C# Linq do combinatorics?C# Linq 可以做组合吗?
【发布时间】:2013-05-20 19:32:55
【问题描述】:

我有这个数据结构:

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

【问题讨论】:

  • 是的,有可能。我强烈建议您不要发布是/否问题,否则有人可能会真正回答这些问题并给您是/否的答案。
  • 到目前为止你尝试过什么?您对如何使用Where 方法进行了哪些研究(您的示例表明您认为它将成为一个有用的运算符)?有很多关于这个主题的教程。你读过吗?你试过什么吗?你的尝试发生了什么?
  • 除非对你想要的有更好的理解,否则没有答案是好的。这里有 3 个不同的答案,我不知道它们是否是你要找的。​​span>
  • 我不想要属性 Count 的总和,我想要 Count 属性总和小于等于 100 的产品。
  • @Alexsandro_xpt 如果您对 lambdas 有足够的了解,可以在问题中询问它,那么您对将它与 LINQ 一起使用有什么不明白的呢?除了 lambda 之外,您在示例代码中拥有所需的一切,在这种情况下 lambda 很简单。

标签: c# linq lambda


【解决方案1】:

从您在其他人的答案和your gist (link) 中留下的cmets 来看,您要解决的问题似乎实际上是背包问题——尤其是0/1 Knapsack Problem (link)

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

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

【讨论】:

【解决方案2】:

你需要Count扩展方法

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

编辑:

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

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

【讨论】:

  • Count and Sum 返回一个 Int 值。我不想求和或计数,我想要他的属性 Count 总和小于或等于 100 的产品;
  • 所以你是说你想要列表中的所有内容,只要整个列表
  • 这个问题,他们的名字不一样。我认为 LINQ 不可能,我正在寻找另一种算法。
  • 您的列表中是否包含同名的产品?
  • 不,@Uzzy,我只知道:应该得到他们的 Count 属性总和不超过 100 的产品
【解决方案3】:
list.Where(p=> p.Count <= 100).ToList();

【讨论】:

  • 不,这只会返回 Count 属性小于或等于 100 的产品。我需要她的属性计数总和为
  • @Alexsandro_xpt “我希望 LINQ 或 Lambda 总和 Count 属性,并且只给我 Count 属性小于或等于 100 的产品对象。”他给了你你想要的……
  • 那么,您正在寻找产生小于 100 的结果的所有可能的 List 组合?所以 { { Book }, { Book,Computer}, { Computer }, {Car}, .... } ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多