Подтвердить что ты не робот

Как избежать цикла while в С#

Я пытаюсь избежать цикла while. В принципе, если условие "if" выполнено, я хотел бы иметь возможность выйти из этого цикла:

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

Ответ 1

Используйте break; для выхода из первого цикла:

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

Если вы также хотите избежать второго цикла, вам может понадобиться использовать флаг и проверить защиту out out:

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

Или, если вы хотите полностью выйти из функции изнутри вложенного цикла, введите return; вместо break;.

Но на самом деле это не считается лучшей практикой. Вы должны найти способ добавить в логику while необходимую логическую логику.

Ответ 3

break или goto

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

Ответ 4

Если вам нужно продолжить использование дополнительной логики...

break;

или если у вас есть значение для возврата...

return my_value_to_be_returned;

Однако, глядя на ваш код, я считаю, что вы будете контролировать цикл с приведенным ниже примером без использования перерыва или возврата...

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

Ответ 5

Какой цикл вы пытаетесь выйти? Простой break; выйдет из внутреннего цикла. Для внешнего цикла вы можете использовать переменную с ограниченным окружением (например, boolean exit = false;), которая установлена ​​в true только перед тем, как вы нарушите внутренний цикл. После того, как внутренний блок цикла проверяет значение выхода, и если true, используйте break; снова.

Ответ 6

"break" - это команда, которая вырывается из "ближайшего" цикла.

Хотя существует много хороших применений для разрыва, вы не должны использовать его, если вам это не нужно - это можно рассматривать как еще один способ использования goto, который считается плохим.

Например, почему бы и нет:

while (!(the condition you're using to break))
        {
         //Your code here.
        }

Если причина, по которой вы используете "break", состоит в том, что вы не хотите продолжать выполнение этой итерации цикла, вы можете использовать ключевое слово "продолжить", которое сразу переходит к следующей итерации цикл, будь то во время или для.

while (!condition) {
   //Some code
   if (condition) continue;
   //More code that will be skipped over if the condition was true
}

Ответ 7

Извините за necro-add, но там что-то я действительно хотел вставить, что отсутствует в существующих ответах (для тех, кому нравится, как я наткнулся на этот вопрос через google): реорганизуйте свой код. Это не только облегчит чтение/обслуживание, но и часто удалит эти типы проблем с маршрутизацией.

Здесь я бы наклонился, если бы мне пришлось программировать функцию выше:

private const string CatchupLineToIndicateLogDump = "mp4:production/CATCHUP/";
private const string BatchFileLocation = "Command.bat";

private void CheckLog()
{
    while (true)
    {
        Thread.Sleep(5000);
        if (System.IO.File.Exists(BatchFileLocation))
        {
            if (doesFileContainStr(BatchFileLocation, CatchupLineToIndicateLogDump))
            {
                RemoveLogAndDump();
                return;
            }
        }
    }
}

private bool doesFileContainStr(string FileLoc, string StrToCheckFor)
{
  // ... code for checking the existing of a string within a file
  // (and returning back whether the string was found.)
}

private void RemoveLogAndDump()
{
  // ... your code to call RemoveEXELog and kick off test.exe
}