【发布时间】:2017-12-11 20:49:51
【问题描述】:
这个问题与this SO post 几乎相同,只是我在寻找VB.NET (.NET 4) 的解决方案。我已经旋转了足够长的时间,试图想出一个通用的解决方案来解决这个“电源组”问题。
给定:
Dim choices As IEnumerable(Of String) = {"Coffee", "Tea", "Milk", "Cookies"}
Dim choiceSets = choices.CombineAll()
我正在寻找 choiceSets 成为 IEnumerable(Of IEnumerable(Of T)) 以便我可以执行以下操作:
For each choiceSet in choiceSets
Console.WriteLine(String.Join(", ", choiceSet))
Next
并获得如下所示的结果:
Coffee
Tea
Milk
Cookies
Coffee, Tea
Coffee, Milk
Coffee, Cookies
Tea, Milk
Tea, Cookies
Milk, Cookies
Coffee, Tea, Milk
Coffee, Tea, Cookies
Coffee, Milk, Cookies
Tea, Milk, Cookies
Coffee, Tea, Milk, Cookies
如您所见,这是来自源 IEnumerable(Of T) 的每个 非重复 组合(其中可能有 1 到多个项目 - 本示例只有 4 个),它基于源 IEnumerable(Of T) 中的项目的顺序,列表中的每个项目都 >= 内部 IEnumerable(Of T) 中的项目数的前一个项目。
不管怎样,这不是功课;虽然确实有这种感觉。
编辑:更新了示例,使其看起来不像是按字母顺序排序的结果,以强调使用源 IEnumerable(Of T) 的现有顺序并添加了第 4 个选项以阐明每组中的排序要求。
【问题讨论】:
-
请注意,IEnumerable
不保证顺序一致,因此“尊重”它可能因调用而异。 -
@dlev 这很值得注意,谢谢。我认为这个问题仍然可以与 IEnumerable
确实保证一致排序的(错误)假设有关。为了简单起见,让我们假装它确实如此:) -
你可以试试这里的代码示例:codeproject.com/KB/recipes/Combinatorics.aspx
-
@mellamokb 感谢您的链接。当我开始研究这个时,我确实看到了那篇文章的代码。在我看来,这似乎是一个过于复杂的解决方案,尤其是当我看到在自包含扩展中完成的类似组合问题的示例时。我对这个问题的后备解决方案确实是那篇文章的解决方案,如果没有其他人能想出一些不那么笨重的东西。
-
请注意,您想要的称为集合的“幂集”;所有子集的集合。 (幂集还包括空子集,您将其省略。)如果您正在寻找此问题的解决方案,知道它的正确名称会有所帮助。
标签: .net vb.net algorithm combinatorics