2012-05-21 2 views
5

Mein Problem ist wie folgt:Wie für dynamische For-Loop-Ebenen zu codieren?

Ich habe mehrere Listen müssen permutiert werden, aber die Liste Nummern sind unerkennbar. Und jede Elementnummer in jeder Liste ist auch unerkennbar. Sicne Ich möchte alle Listenelementkombinationen durchqueren, wie 1) Auswahl A von Liste 1, A von Liste 2, A von Liste 3; 2) ick A aus Liste 1, A aus Liste 2, B aus Liste 3 ... für ALL-Permutation.

ich verschachtelte for-Schleife zu durchlaufen, wie wenn ich zwei Listen haben, dann:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       // Do sth 
      } 
     } 

Wenn ich drei Listen haben, dann:

 for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++) 
     { 
      for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++) 
      { 
       for (int k = 0; k < list[2].EnergyParameters.ListEnergyLevelCandidates.Count; k++) 
       { 
        // Do sth 
       } 
      } 
     } 

Da die Listennummern unerkennbar sind , also sind die Nestzahlen unerkennbar, was bedeutet, dass ich nicht weiß, wie viele For-Schleife-Stufen geschrieben werden müssen.

Wie kann ich unter diesen Umständen Code für dynamische For-Loop-Ebenen schreiben? Ich möchte nicht 10 Schleifen für 10 Listen schreiben.

Antwort

10

Falls Sie nicht wissen, wie viele Listen es gibt, schreiben Sie keine verschachtelten Schleifen. Stattdessen schreiben Sie Rekursion. Auf jeder Ebene des Aufrufs Sie Schleife eine einzige Liste, wie folgt aus:

void AllCombos(List<string>[] lists, int level, string[] current) { 
    if (level == lists.Length) { 
     // Do somthing; items of current[] contain elements of the combination 
    } else { 
     foreach (var s in lists[level]) { 
      current[level] = s; 
      AllCombos(lists, level+1, current); 
     } 
    } 
} 

Anruf AllCombos wie folgt:

var lists = new List<string>[10]; 
for (int i = 0 ; i != 10 ; i++) { 
    lists[i] = PopulateMyList(i); 
} 
string[] current = new string[lists.Length]; 
AllCombos(lists, 0, current); 
+0

Enthält diese noch exexute Multi-Loop? – Asker

+0

@Asker Es tut. Obwohl die Schleifen nicht textuell in der Quelle des Programms verschachtelt sind, sind sie zur Ausführungszeit verschachtelt. Siehst du wie sich der 'AllCombos' selbst nennt? Hier findet die "Magie" statt (obwohl es nichts Magisches daran gibt). – dasblinkenlight

+0

Warum & Was ist 10? Wird maximale Tiefe angenommen oder was? –