Как избежать цикла 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 >>
}
}
}
}
}
Ответы
Ответ 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
необходимую логическую логику.
Ответ 2
Но вы также можете заглянуть в совсем другой подход, прослушивая события файловой системы.
Ответ 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
}