2009-03-07 18 views
1

В следующем коде C# фрагмент
У меня есть «while» петля внутри «foreach» петли, и я хочу, чтобы перейти к следующему пункту «foreach», когда происходит определенное условие.Продолжайте в то время как внутри Еогеаспа

foreach (string objectName in this.ObjectNames) 
{ 
    // Line to jump to when this.MoveToNextObject is true. 
    this.ExecuteSomeCode(); 
    while (this.boolValue) 
    { 
     // 'continue' would jump to here. 
     this.ExecuteSomeMoreCode(); 
     if (this.MoveToNextObject()) 
     { 
      // What should go here to jump to next object. 
     } 
     this.ExecuteEvenMoreCode(); 
     this.boolValue = this.ResumeWhileLoop(); 
    } 
    this.ExecuteSomeOtherCode(); 
} 

«continue» будет прыгать в начале «while» петли не «foreach» цикла. Есть ли ключевое слово для использования здесь, или я должен просто использовать goto, который мне не очень нравится.

ответ

2

Следующие должны сделать трюк

foreach (string objectName in this.ObjectNames) 
{ 
    // Line to jump to when this.MoveToNextObject is true. 
    this.ExecuteSomeCode(); 
    while (this.boolValue) 
    { 
     if (this.MoveToNextObject()) 
     { 
      // What should go here to jump to next object. 
      break; 
     } 
    } 
    if (! this.boolValue) continue; // continue foreach 

    this.ExecuteSomeOtherCode(); 
} 
8

Используйте ключевое слово break. Это выйдет из цикла while и продолжит выполнение вне него. Поскольку после этого вы ничего не получили, он будет перемещаться к следующему элементу в цикле foreach.

На самом деле, глядя на ваш пример более внимательно, вы на самом деле хотите иметь возможность продвигать цикл for без выхода из него. Вы не можете сделать это с помощью цикла foreach, но вы можете разбить цикл foreach на то, что он фактически автоматизирует. В .NET цикл foreach фактически отображается как вызов .GetEnumerator() объекта IEnumerable (который является объектом this.ObjectNames).

в цикле, цикл в основном это:

IEnumerator enumerator = this.ObjectNames.GetEnumerator(); 

while (enumerator.MoveNext()) 
{ 
    string objectName = (string)enumerator.Value; 

    // your code inside the foreach loop would be here 
} 

После того как вы эту структуру, вы можете вызвать enumerator.MoveNext() в вашем время цикла, чтобы перейти к следующему элементу. Так что ваш код станет:

IEnumerator enumerator = this.ObjectNames.GetEnumerator(); 

while (enumerator.MoveNext()) 
{ 
    while (this.ResumeWhileLoop()) 
    { 
     if (this.MoveToNextObject()) 
     { 
      // advance the loop 
      if (!enumerator.MoveNext()) 
       // if false, there are no more items, so exit 
       return; 
     } 

     // do your stuff 
    } 
} 
+0

Мне жаль фрагмент кода, который я первый добавил не очень точны. Есть больше кода для пропусков. Использование break не поможет. Я обновил фрагмент кода, чтобы быть более точным. – Amr

+2

Хотя мне нравится ваш ответ, поскольку он решает проблему без добавления дополнительной логики; Я не думаю, что это хорошее решение. Я бы не знал, как это сделать в случае OP, но структурировать код таким образом, чтобы эта сумасшедшая логика не была необходима, в первую очередь, было бы лучшим решением. – nlaq

+0

Слишком плохо, что вы не можете комментировать комментарии ... +1 @ Нельсон тоже. –

2

break; ключевое слово выхода из цикла:

foreach (string objectName in this.ObjectNames) 
{ 
    // Line to jump to when this.MoveToNextObject is true. 
    while (this.boolValue) 
    { 
     // 'continue' would jump to here. 
     if (this.MoveToNextObject()) 
     { 
      break; 
     } 
     this.boolValue = this.ResumeWhileLoop(); 
    } 
} 
0

Вы можете использовать "перерыв"; для выхода из самого сокровенного в то время, когда он или выйдет.

1

Используйте goto.

(я предполагаю, что люди будут с ума с этим ответом, но я определенно думаю, что это более удобным для чтения, чем все другие варианты.)