这个问题与this SO post几乎相同,只是我在寻找一个VB.NET(.NET 4)解决方案。为了解决这个“功耗集合”问题,我花了很长时间试图提出一个通用的解决方案。生成IEnumerable(Of T)元素的所有唯一组合
考虑:
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
2011-05-12 15:57:09
@dlev这是值得注意的,谢谢。我认为这个问题仍然可以支持IEnumerable确保一致排序的(错误)假设。让我们假装它是为了简单起见:) –
ckittel
2011-05-12 15:59:45
你可以尝试在这里的代码示例:http://www.codeproject.com/KB/recipes/Combinatorics.aspx – mellamokb 2011-05-12 16:34:05