2017-12-28 18 views
0

からすべてのユニークな組み合わせを生成: Dictionary<int, List<myObject>>は、私は、次の辞書持っている辞書<int, List<T>>

を私はmyObjectというの全ての組み合わせpossiblesを取得し、キーごとに1つだけmyObjectというインスタンスを服用したいと思います。キーの数とキーあたりのmyObjectの数が変わります。

したがって、一例として、私は、次の辞書がある場合:

{ 
    { 0, {A1, A2}, 
    { 1, {B1}, 
    { 2, {C1, C2}, 
} 

を私がしたい:

{A1、B1、C1}、{A1、B1、C2}、{ A2、B1、C1}、{A2、B1、C2}

ネストされたforeachでこれを行うのは簡単です。リストの数は常に同じですが、変更しても簡単な方法は見つけられませんこれを行うの。

どのようにすればいいですか?

編集: 辞書は他の目的では使用されません。

harcodedネストされた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

辞書キーは何のためにも使用されていません。 – Magnetron

答えて

0

あなたの3つのリストがすべて{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}であるとします。この場合、すべての数字を取ることで結果が簡単に形成されることは明らかです。0 ... 999および入れ子のforeachを各桁のより良いものに変換する方法は明白です。この「桁上げ」は、リストごとに別々の列挙子を作成し、最初の要素を指すようにMoveNext()を1回呼び出すと、非常に簡単に一般化できます。今、(enumerator[0].Current, enumerator[1].Current, ...)には最初の組み合わせが含まれています。最後の列挙子で次の組み合わせに移動するには、もう一度MoveNext()を呼び出します。 trueが返された場合は、次の組み合わせが既にあります。 trueが返されない場合は、最初の要素を再度指すようにリセットし、最後の2番目の列挙子を使用して再試行します。ある時点でMoveNext()trueを返した場合は、次の組み合わせがあります。何も返さない場合true、あなたはすべての組み合わせを使い果たしました。

関連する問題