Использование цикла foreach - PullRequest
0 голосов
/ 17 марта 2010

Я нарушаю код цикла для , не используя break , как у меня для цикла, приведенного ниже. И когда i равно 1 или 2 или 3 или любое другое, но если условие истинно, тогда цикл будет прерван, потому что i будет 5, если условие истинно. И поэтому NO нужен разрыв в этом месте. Потому что я не хочу использовать перерыв . Я сделал вот так. Это работает.

int myCondition=0;
bool flag=false;
for(int i=0;i<5;i++)
{
   if(myCondition==0)
   {
       flag=true;
   }
   if(flag)
       i=5;
}

Но теперь я хочу использовать цикл foreach , и в этом цикле, когда выполняется какое-либо условие, я хочу разорвать код цикл foreach . Итак, что я должен сделать здесь для прерывания код foreach loop без использования break ? Как и в приведенном выше цикле for, я инициализирую i до 5, когда условие выполняется. В цикле foreach все, что нужно сделать, чтобы избежать break .

Ответы [ 7 ]

10 голосов
/ 17 марта 2010

Вы должны использовать то, что на языке. Не нужно избегать break - просто используйте его. Или, другими словами, «я не хочу использовать break» не является достаточным оправданием: если вы думаете, что у вас есть действительно хорошая причина , чтобы не использовать его, то должен объяснить эту причину. Не обманывайте себя, притворяясь, что совершенно разумных функций не существует, и придумывайте замысловатые схемы, чтобы их избежать.

8 голосов
/ 17 марта 2010

Не делай этого.

Ваши манипуляции с 'i' в цикле for уже сомнительны. Попытка связываться с итератором в цикле foreach была бы просто грязной. Если он компилируется вообще.

Я бы написал ваш пример с break или как:

bool myCondition=false;
for(int i=0;i<5 && !myCondition;i++)
{
   ....
}

В цикле foreach, когда вы закончите до завершения всей последовательности, просто наберите break

4 голосов
/ 17 марта 2010

Вероятно, это меня опровергнет ... но вы должны использовать ключевое слово break.

В противном случае:

foreach(var foo in bar)
{
  if(condition)
  {
    //perform normal loop code
    //set condition if required.
  }
  //otherwise do nothing - the loop will iterate all the way to the end without 
  //doing anything.
}

Вы можете быть более выразительным и использовать if(condition){ /*blah*/}else { continue; } внутри цикла - но в любом случае это делает то же самое.

Вы не можете сделать больше, чтобы разбить друг друга, чем:

  • Использование break
  • Брось исключение
2 голосов
/ 17 марта 2010

В общем, «шаблон», который вы описываете здесь, является запахом кода. Это не хорошая идея, чтобы изменить переменную индекса в цикле for. Это может привести к нечитаемому, трудно поддерживаемому коду, особенно если цикл увеличивается.

Как говорится, почему вы не хотите использовать ключевое слово break. Он предназначен для этой цели, и какой бы недостаток он ни имел (по вашему мнению), он все же является гораздо лучшим решением, чем тот, который вы описали здесь.

Наконец, я не вижу способа сделать то же самое, используя цикл foreach разумным способом.

1 голос
/ 17 марта 2010

Ну, вот почему существует эта команда "перерыв". У меня нет причин, почему вы не должны его использовать.

1 голос
/ 17 марта 2010

Не использовать break в цикле for (;;) - серьезная стилистическая ошибка. Но вам это сойдет с рук. Но не тогда, когда вы используете foreach, у вас есть для использования ключевого слова break.

Обратите внимание на заголовок этого сообщения в блоге .

0 голосов
/ 17 марта 2010

Ваш код должен быть абсолютно:

bool myCondition = false;

for(int i=0;i<5;i++)
{
   // do stuff
   if(myCondition)
      break;
}

Мало того, что вы используете команды (т.е. инструменты), предоставляемые языком, вы также делаете код очень читабельным и обслуживаемым. Команда break является фундаментальной для языка.

Попытка придумать причину, по которой не стоит использовать break - это все равно, что делать на калькуляторе *1008* - буквально перевернуть калькулятор, получить маркер серебряной краски и кое-что сделать. Вы наносите вред себе, не используя инструменты перед собой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...