我有以下字典:
Dictionary<int, List<myObject>>
我想获得myObject的所有可能组合,并且每个键只能获取一个myObject实例。键的数量和每个键的myObject数量将会改变。
举个例子,如果我有以下字典:
{
{ 0, {A1, A2},
{ 1, {B1},
{ 2, {C1, C2},
}
我想:
{A1,B1,C1},{A1,B1,C2},{A2,B1,C1},{A2,B1,C2}
使用嵌套的foreach很容易做到这一点,如果列表的数量始终相同,但是当它发生变化时,我无法找到一种简单的方法。< / p>
任何想法如何做到这一点?
修改 该词典不用于任何其他内容。
带编码的嵌套foreach方法将是(伪代码):
var result = new List<List<myObject>>
foreach myObjectA in myListForKey(0)
foreach myObjectB in myListForKey(1)
foreach myObjectC in myListForKey(2)
result.add(new list<myObject>{myObjectA , myObjectB, myObjectC })
这种方法的问题在于,我只能处理3个键的场景,它不是动态的,如果有更多的键在词典中它不起作用或键不同。
答案 0 :(得分:0)
假设您的三个列表都是{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
。在这种情况下,显而易见的是,通过取所有数字0
... 999
和可以很容易地形成结果,很明显如何翻译嵌套的{{ 1}}为每个数字更好的东西:添加携带。这个&#34;加上随身携带&#34;可以非常容易地推广,如果为每个列表创建一个单独的枚举器并调用foreach
一次指向第一个元素。现在,MoveNext()
包含第一个组合。要转到下一个组合,请在最后一个枚举器上再次呼叫(enumerator[0].Current, enumerator[1].Current, ...)
。如果它返回MoveNext()
,则您已经拥有下一个组合。如果它没有返回true
,则将其重置为再次指向第一个元素,然后使用倒数第二个枚举器重试。如果某个时间true
返回MoveNext()
,则您有下一个组合。如果没有人返回true
,那么您已经用尽了所有组合。