Frage

In dem folgenden C # Codeausschnitt
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.

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 der ‚while‘ Schleife springen nicht die ‚foreach‘ Schleife. Gibt es ein Schlüsselwort ist hier zu verwenden, oder sollte ich gerade gehe zu verwenden, die Ich mag es nicht wirklich.

War es hilfreich?

Lösung

Im Folgenden soll es tun

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();
}

Andere Tipps

Mit dem Schlüsselwort break. Das wird die while-Schleife verlassen und weiterhin die Ausführung außerhalb. Da Sie, nichts nach, während hätte es Schleife um zum nächsten Element in der foreach-Schleife.

Eigentlich bei Ihrem Beispiel genauerem Hinsehen, die Sie tatsächlich die for-Schleife in der Lage sein wollen, voranzutreiben, ohne die beim Beenden. Sie können dies mit einer foreach-Schleife nicht tun, aber Sie können eine foreach-Schleife brechen, was es automatisiert tatsächlich. In .NET ist eine foreach-Schleife tatsächlich als .GetEnumerator () -Aufruf auf das IEnumerable-Objekt angezeigt (die Ihre 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
}

Wenn Sie diese Struktur haben, können Sie enumerator.MoveNext () innerhalb Ihrer while-Schleife rufen zum nächsten Element zu gelangen. So Ihr Code würde:

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
    }
}

Das break; Schlüsselwort beendet eine Schleife:

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();
    }
}

Mit goto.

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

Sie können mit "break;" die innerste während oder foreach zu verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top