62 votes

Comment échapper à une boucle while en C#

J'essaie d'échapper à une boucle while. En fait, si la condition "if" est remplie, j'aimerais pouvoir sortir de cette boucle :

private void CheckLog()
{
    while (true)
    {
        Thread.Sleep(5000);
        if (!System.IO.File.Exists("Command.bat"))
            continue;

        using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
        {
            string s = "";
            while ((s = sr.ReadLine()) != null)
            {
                if (s.Contains("mp4:production/CATCHUP/"))
                {
                    RemoveEXELog();

                    Process p = new Process();
                    p.StartInfo.WorkingDirectory = "dump";
                    p.StartInfo.FileName = "test.exe";
                    p.StartInfo.Arguments = s;
                    p.Start();

                    << Escape here - if the "if" condition is met, escape the loop here >>
                }
            }
        }
    }
}

89voto

Dirk Points 1494

Utilisez break; pour échapper à la première boucle :

if (s.Contains("mp4:production/CATCHUP/"))
{
   RemoveEXELog();
   Process p = new Process();
   p.StartInfo.WorkingDirectory = "dump";
   p.StartInfo.FileName = "test.exe"; 
   p.StartInfo.Arguments = s; 
   p.Start();
   break;
}

Si vous voulez également échapper à la deuxième boucle, vous devrez peut-être utiliser un drapeau et vérifier la garde de la boucle de sortie :

        boolean breakFlag = false;
        while (!breakFlag)
        {
            Thread.Sleep(5000);
            if (!System.IO.File.Exists("Command.bat")) continue;
            using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    if (s.Contains("mp4:production/CATCHUP/"))
                    {

                        RemoveEXELog();

                        Process p = new Process();
                        p.StartInfo.WorkingDirectory = "dump";
                        p.StartInfo.FileName = "test.exe"; 
                        p.StartInfo.Arguments = s; 
                        p.Start();

                        breakFlag = true;
                        break;
                    }
                }
            }

Ou, si vous voulez quitter complètement la fonction à l'intérieur de la boucle imbriquée, mettez une balise return; au lieu d'un break; .

Mais elles ne sont pas vraiment considérées comme des bonnes pratiques. Vous devez trouver un moyen d'ajouter la logique booléenne nécessaire dans votre fichier while gardes.

9voto

zellio Points 8863

break o goto

while ( true ) {
  if ( conditional ) {
    break;
  }
  if ( other conditional ) {
    goto EndWhile;
  }
}
EndWhile:

5voto

Tim Points 4483

4voto

Alban Points 423

Si vous avez besoin de continuer avec une logique supplémentaire, utilisez...

break;

ou si vous avez une valeur à retourner...

return my_value_to_be_returned;

Cependant, en regardant votre code, je pense que vous contrôlerez la boucle avec l'exemple révisé ci-dessous sans utiliser de break ou de return...

private void CheckLog()
        {
            bool continueLoop = true;
            while (continueLoop)
            {
                Thread.Sleep(5000);
                if (!System.IO.File.Exists("Command.bat")) continue;
                using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
                {
                    string s = "";
                    while (continueLoop && (s = sr.ReadLine()) != null)
                    {
                        if (s.Contains("mp4:production/CATCHUP/"))
                        {
                            RemoveEXELog();

                            Process p = new Process();
                            p.StartInfo.WorkingDirectory = "dump";
                            p.StartInfo.FileName = "test.exe"; 
                            p.StartInfo.Arguments = s; 
                            p.Start();
                            continueLoop = false;
                        }
                    }
                }
            }
        }

2voto

tomfumb Points 1486

Quelle boucle essayez-vous de quitter ? Une simple break; quittera la boucle interne. Pour la boucle externe, vous pouvez utiliser une variable dépendant de la boucle externe (par exemple, le booléen exit = false ;) qui est définie comme vraie juste avant de rompre votre boucle interne. Après le bloc de la boucle interne, vérifiez la valeur de exit et, si elle est vraie, utilisez la variable break; encore.

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