从Dictionary <int,list <t =“”>&gt;

时间:2017-12-28 10:06:45

标签: c#

我有以下字典: 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个键的场景,它不是动态的,如果有更多的键在词典中它不起作用或键不同。

1 个答案:

答案 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,那么您已经用尽了所有组合。