2013-05-26 2 views
0

У меня есть код, как:Как выполнить прыжок с двойной петлей?

while(condition) 
{ 
    foreach(string s in list) 
    { 
     switch(j) 
     { 
      case 1: 
      //do something 
      continue;//can I break out of foreach here? 
      case 2: 
      //do another 
      continue;//break 
      ..other cases; 
     } 
     //do some stuff 
    } 
    //do some stuff 
} 

Я рассматриваю goto, но я слышал много плохих вещей о нем.

+3

Пожалуйста, добавьте соответствующий тег на свой вопрос ... –

+0

вы можете установить 'флаг' и сломать, если установлен флаг'. и, таким образом, избегать goto .... но «оптовый запрет (на goto) просто глупо» - @Jon Purdy http://stackoverflow.com/a/16555996/436084 – Bill

+0

Вы не должны выходить из для каждого. Петля с течением времени и итератором и с флагом в качестве второго условия. – Noctua

ответ

1

Я предполагаю, что вы пытаетесь сделать, это разрыв внутри коммутатора, и он выйти для цикла, но не время цикла. Мое предложение состоит в том, чтобы поместить все это в функцию и поставить оператор возврата, где бы вы ни захотели сломаться. Например:

void f() { 
     foreach(string s in list) { 
      switch(j) { 
       case 1: 
       //do something 
       return; 
       case 2: 
       //do another 
       continue;//break 
       ..other cases; 
      } 
     //do some stuff 
     } 
} 

// ... later somewhere 
while (condition) { 
    f(); 
} 
+0

слишком много вызовов функций может иметь удар производительности, IMHO :) – Bill

+3

в наше время есть определенное предпочтение для читаемого кода по микро-оптимизации. Функциональные вызовы достаточно быстрые в 99,9% случаев. – Kevin

+0

Да, но слишком много раскручивания стека могут быть дорогими при некоторых обстоятельствах. Но ваше решение def работает и ничего плохого :) – Bill

1

Просто используйте булеву переменную:

while(condition) 
{ 
    foreach(string s in list) 
    { 
     var breakout = false; 
     switch(j) 
     { 
      case 1: 
       //do something 
       breakout = true; 
       break; 
      // ... 
     } 

     if(breakout) 
     { 
      break; 
     } 
    } 
    //do some stuff 
} 
1

булева переменная состояния следует сделать трюк:

bool isBadInput = false; 
bool isRunning = true; 

while(isRunning && !isBadInput){ 
    for(int j = 0; j < list.size() && !isBadInput; ++j){ 
    switch(j){ 
     case 0: 
     int res = handleCase0(); 
     if(res == -1){ 
      isBadInput = true; 
      isRunning = false; 
     } 
     break; 
     //similar for other cases 
    } 
} 
+0

Да, я думал о переменной, но я хотел знать, есть ли какие-либо более конструктивные особенности. – rtuner

+0

Если структура является тем, что вы хотите, тогда подумайте о том, чтобы сделать эти петли в функции, если это возможно. Таким образом, его легче читать и повторно использовать. – dchhetri

0

Я рассматриваю goto, но я слышал много плохих вещей о нем.

Тогда вы должны обеспечить, чтобы вы были полностью информированы перед принятием решения. Этот предмет подробно освещен статьями, связанными с GOTO still considered harmful?.

Напишите код, который, по вашему мнению, кратко выражает ваше намерение, является идиоматическим для вашего языка программирования и, в конечном счете, будет проще всего поддерживать.

+0

. Я думаю, что на этот вопрос возникает ответ на этот ответ (http://stackoverflow.com/a/46789/1261657). – rtuner

+0

... и мой ответ (частично) основан на [этом комментарии] (http://stackoverflow.com/q/46586/78845#comment19670998_46789) на этот ответ. Заявления 'goto' имеют свое место (хотя я не могу вспомнить последний раз, когда я действительно использовал его). В этом случае я, вероятно, просто «вернусь» от функции, но это может быть неуместно во всех случаях. – Johnsyweb

Смежные вопросы