2012-05-21 4 views
5

Mój problem jest taki:Jak kodować dynamiczne poziomy pętli for?

Mam kilka list musi być permutowane, ale numery list są niepoznawalne. I wszystkie numery elementów na każdej liście są również niepoznawalne. Sicne Chciałbym przemierzyć całą kombinację elementów listy, np. 1) wybierz A z listy 1, A z listy 2, A z listy 3; 2) ick A z listy 1, A z listy 2, B z listy 3 ... dla ALL permutacji.

użyć zagnieżdżonej pętli do przemieszczenia, jak jeśli dwa wykazy, a następnie:

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

Jeśli trzy listy, a następnie:

 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 
       } 
      } 
     } 

Ponieważ liczba liście są niepoznawalnym , więc numery gniazd są niepoznawalne, co oznacza, że ​​nie wiem, ile poziomów pętli for musi być zapisanych.

W tej sytuacji, w jaki sposób mogę napisać kod dla dynamicznych poziomów pętli for? Nie chcę pisać 10 pętli na 10 list.

Odpowiedz

10

Jeśli nie wiesz, ile list istnieje, nie pisz zagnieżdżonych pętli: zamiast tego wpisujesz rekursję. Na każdym poziomie pw ty pętli jednej listy, na przykład:

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); 
     } 
    } 
} 

połączeń AllCombos następująco:

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

Czy to nadal exexute multi-pętlę? – Asker

+0

@Asker To robi. Mimo że pętle nie są zagnieżdżone w źródle programu, są zagnieżdżane w czasie wykonywania. Zobacz, jak sam się nazywa "AllCombos"? To tutaj dzieje się "magia" (chociaż nie ma w niej nic magicznego). – dasblinkenlight

+0

dlaczego i co jest 10? Czy założono maksymalną głębokość lub co? –