253 votes

Sortir d'une boucle imbriquée

Si j'ai une boucle for qui est imbriquée dans une autre, comment puis-je efficace de sortir de deux boucles (intérieure et extérieure), le plus rapidement possible?

Je ne veux pas avoir à utiliser un booléen et puis faut dire d'aller à une autre méthode, mais plutôt juste pour exécuter la première ligne de code après la boucle externe.

Quel est un moyen rapide et agréable façon d'aller à ce sujet?

Merci


Je pensais que les exceptions ne sont pas pas cher/ne doit être jeté dans un exceptionnel état etc. Donc je ne pense pas que cette solution serait bon d'un point de vue performances.

Je ne le sens pas c'est le droit de profiter des nouvelles fonctionnalités .NET (anon méthodes) de faire quelque chose qui est assez fondamental.

À cause de cela, tvon (désolé ne pouvez pas orthographier nom complet de l'utilisateur!) a une solution sympa.

Marc: Belle utilisation de l'anon méthodes, et c'est trop grand, mais parce que je pourrais être dans un métier où on n'utilise pas une version de .NET/C# qui prend en charge anon méthodes, j'ai besoin de savoir une approche traditionnelle.

266voto

Marc Gravell Points 482669

Eh bien, "goto", mais que c'est moche... et pas toujours possible. Vous pouvez également placer les boucles dans une méthode (ou un anon-méthode) et l'utilisation de "retour" pour revenir au code principal.

        // goto
        for (int i = 0; i < 100; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                goto Foo; // yeuck!
            }
        }
    Foo:
        Console.WriteLine("Hi");

        // anon-method
        Action work = delegate
        {
            for (int x = 0; x < 100; x++)
            {
                for (int y = 0; y < 100; y++)
                {
                    return; // exits anon-method
                }
            }
        };
        work(); // execute anon-method
        Console.WriteLine("Hi");

106voto

Nils Pipenbrinck Points 41006

Ne sais pas si il fonctionne en C#, mais en C je fais souvent ce:

    for (int i = 0; i < 100; i++)
    {
        for (int j = 0; j < 100; j++)
        {
            if (exit_condition)
            {
                // cause the outer loop to break:
                i = INT_MAX;
                Console.WriteLine("Hi");
                // break the inner loop
                break;
            }
        }
    }

45voto

BCS Points 18500

Pour les personnes qui ont trouvé cette question par le biais d'autres langues, Javascript, Java, et D permet marqué les pauses et continue:

outer: while(fn1())
{
   while(fn2())
   {
     if(fn3()) continue outer;
     if(fn4()) break outer;
   }
}

31voto

tvanfosson Points 268301

Utiliser un adapté à la garde dans la boucle externe. Régler la garde dans la boucle interne avant de le casser.

bool exitedInner = false;

for (int i = 0; i < N && !exitedInner; ++i) {

    .... some outer loop stuff

    for (int j = 0; j < M; ++j) {

        if (sometest) {
            exitedInner = true;
            break;
        }
    }
    if (!exitedInner) {
       ... more outer loop stuff
    }
}

Ou, mieux encore, de l'abrégé, la boucle interne à la méthode et à la sortie de la boucle externe lorsqu'elle retourne false.

for (int i = 0; i < N; ++i) {

    .... some outer loop stuff

    if (!doInner(i, N, M)) {
       break;
    }

    ... more outer loop stuff
}

20voto

NoizWaves Points 1063

Est-il possible de refactoriser le imbriqués pour la boucle dans une méthode privée? De cette façon, vous pouvez simplement le "retour" de la méthode pour sortir de la boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X