我正试图逃避一个循环。基本上,如果满足“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 >>
}
}
}
}
}
答案 0 :(得分:67)
使用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循环的守卫:
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
警卫中。
答案 1 :(得分:8)
break
或goto
while ( true ) {
if ( conditional ) {
break;
}
if ( other conditional ) {
goto EndWhile;
}
}
EndWhile:
答案 2 :(得分:6)
答案 3 :(得分: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;
}
}
}
}
}
答案 4 :(得分:2)
你想退出哪个循环?一个简单的break;
将退出内循环。对于外部循环,您可以使用外部循环范围的变量(例如boolean exit = false;),它在您打破内部循环之前设置为true。在内部循环块之后检查exit的值,如果为true,则再次使用break;
。
答案 5 :(得分:1)
“break”是一个突破“最接近”循环的命令。
虽然有很多很好的用途,但是你不应该使用它 - 它可以被视为使用goto的另一种方式,这被认为是坏的。
例如,为什么不:
while (!(the condition you're using to break))
{
//Your code here.
}
如果您使用“break”的原因是因为您不想继续执行该循环的迭代,您可能需要使用“continue”关键字,该关键字会立即跳转到下一次迭代循环,无论是时间还是为。
while (!condition) {
//Some code
if (condition) continue;
//More code that will be skipped over if the condition was true
}
答案 6 :(得分:0)
对于necro-add感到抱歉,但有一些我真正想插入的东西在现有答案中缺失(对于像我这样通过谷歌绊倒这个问题的人):重构你的代码。它不仅可以使读取/维护更容易,而且通常会完全消除这些类型的控制路由问题。
如果我必须对上述功能进行编程,那么这就是我所倾向的:
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
}