2009-03-07 10 views
1

Im folgenden C# -Code-Snippet
Ich habe eine ‚while‘ Schleife in einer ‚foreach‘ Schleife, und ich möchte in ‚foreach‘ zum nächsten Punkt springen, wenn eine bestimmte Bedingung auftritt.in weiter, während im Inneren 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' würde zu Beginn des 'while' loop springt nicht der 'foreach' loop. Gibt es ein Schlüsselwort, das ich hier verwenden soll, oder sollte ich nur goto verwenden, was ich nicht wirklich mag?

Antwort

2

Folgendes sollte den Trick

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

das Schlüsselwort break verwenden. Dadurch wird die while-Schleife verlassen und die Ausführung außerhalb davon fortgesetzt. Da du nach der Weile nichts mehr hast, würde es zum nächsten Element in der foreach-Schleife zurückkehren.

Eigentlich bei Ihrem Beispiel genauerem Hinsehen, Sie wollen tatsächlich in der Lage sein, die für die Schleife vorzurücken, ohne die beim Beenden. Sie können dies nicht mit einer foreach-Schleife tun, aber Sie können eine foreach-Schleife auf das reduzieren, was sie tatsächlich automatisiert. In .NET wird eine foreach-Schleife tatsächlich als ein Aufruf von .GetEnumerator() für das IEnumerable-Objekt gerendert (das Ihr this.ObjectNames-Objekt ist).

Die foreach-Schleife ist im Grunde diese:

IEnumerator enumerator = this.ObjectNames.GetEnumerator(); 

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

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

Sobald Sie diese Struktur haben, können Sie enumerator.MoveNext() innerhalb Ihrer while-Schleife auf das nächste Element vorzurücken nennen. So würde Ihr Code werden:

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

Es tut mir leid der Code-Snippet, das ich zuerst nicht sehr genau hinzugefügt. Es gibt mehr Code zum Überspringen. Die Verwendung von Pause wird nicht helfen. Ich habe das Code-Snippet aktualisiert, um genauer zu sein. – Amr

+2

Obwohl ich Ihre Antwort mag, wie es das Problem löst, ohne zusätzliche Logik hinzuzufügen; Ich denke nicht, dass es eine gute Lösung ist. Ich wüsste nicht, wie das im OP funktioniert, aber den Code so zu strukturieren, dass diese verrückte Logik gar nicht erst benötigt wird, wäre die beste Lösung. – nlaq

+0

Schade, dass Sie Kommentare nicht abstimmen können ... +1 @Nelson auch. –

2

Das break; Schlüsselwort wird eine Schleife verlassen:

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

Sie können "brechen"; um das Innerste während oder foreach zu verlassen.

1

Verwenden goto tun.

(Ich denke, die Menschen mit dieser Antwort verrückt sein, aber ich denke auf jeden Fall, es ist besser lesbar als alle andere Optionen.)

Verwandte Themen