2012-06-19 5 views
3

Как я могу идти об этом, так что если «если» утверждение верно, чтобы пропустить ниже код цикла Еогеасп и идти дальше с остальной частью программыC# - петля Foreach с, если заявление

void() 
{ 
    foreach() 
    { 
     if() 
     { 

     } 
    } 

    //code I want to skip if "if" statement is true 

} 
+0

продолжение ключевое слово приходит на помощь. вы можете использовать «Break», если хотите выйти из цикла for. – AlwaysAProgrammer

+2

Слишком много вашего вопроса неоднозначно. Комментарий Yogendra может быть ответом в зависимости от того, что вы имеете в виду – McAden

+0

, вам нужно объявить bool in if statement block и использовать его в области, где вы хотите пропустить –

ответ

3

Там нет никакого способа, чтобы непосредственно делать то, что вы хотите (без «GOTO» этикетки - упаси), но вы можете использовать «перерыв» ключевое слово, и установить переменную можно сослаться позже.

void() 
{ 
    var testWasTrue = false; 
    foreach() 
    { 
     if() 
     { 
      testWasTrue = true; 
      break; // break out of the "foreach" 
     } 
    } 

    if(!testWasTrue) { 
     //code I want to skip if "if" statement is true 
    } 

} 
+0

Не беспокойтесь о логическом. Сделайте работу, а затем перерыв/возвращение. Если это значительный блок кода, легко можно утверждать, что он должен быть функцией в любом случае. См. Мой пример ниже. – dodexahedron

+0

За исключением того, что это совсем не так. – McAden

+2

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

0
void() 
{ 
    bool skip = false; 
    foreach() 
    { 
     if() 
     { 
      skip = true; 
     } 
    } 

    if(!skip) 
    { 
     //code I want to skip if "if" statement is true 
    } 
} 
1

Ключевое слово 'break' выйдет из цикла.

foreach (someClass a in someArray) 
{ 
    if(a.someProperty) // bool property 
    { 
    //Stuff to do if that condition is true 
    doSomethingElse(); 
    //Calling the break keyword will stop the loop and jump immediately outside of it 
    break; 
    } 
    //Other code to run for each iteration of the loop 
} 

//Here is where execution will pick up either after break is called or after the loop finishes 
0

Только способ я знаю, как флаг bool.

void() 
{ 
    bool x = false; 
    foreach() 
    { 
    if() 
    { 
     x = true; 
     break; 
    } 
    } 
    if(!x) 
    { 
    //Code to skip if "if" statement is true. 
    } 
} 

Не очень элегантный, но простой. Edit: бить по 12 секунд :)

+0

Нет необходимости в буле. Сделайте работу, а затем перерыв. – dodexahedron

1
void() 
{ 
    bool process = true; 
    foreach() 
    { 
      if() 
      { 
       process = false; 
       break; 
      } 
    } 

    if (process) 
    { 
     //code I want to skip if "if" statement is true 
    } 

} 
1

Как упоминалось в моем комментарии вы можете сделать это с помощью дополнительной переменной BOOL.

void() 
    { 
     bool positiveResult; // by default it gets false value 
     foreach() 
     { 
      if() 
      { 
       positiveResult = true; 
       // you may use "break" to skip the loop 
       break; 
      } 
     } 

     if(!positiveResult ) 
     { 
      //code I want to skip if "if" statement is true 
     } 

    } 
+0

Не нужно перебирать всю коллекцию. Перерыв или возвращение как можно скорее. Кроме того, nix логическое. Нет необходимости в этом вообще. – dodexahedron

3

Я знаю, это было уже ответил, но я решил бросить в моих 2 центах, так как никто не считал абстрагирование чека отдельного метода:

void() 
{ 
    if (ShouldDoStuff(myCollection)) 
     DoStuff(myCollection); 
    else 
     DoOtherStuff(myCollection); 
} 

private bool ShouldDoStuff(collection) 
{ 
    foreach() 
    { 
     if() 
      return true; 
    } 
    return false; 
} 

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

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

Даже если DoStuff и DoOtherStuff не были отнесены к их собственным методам, они обеспечивают лучшую читаемость и логический поток.

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