如何在C#中转义while循环

时间:2011-07-16 19:16:35

标签: c# .net windows

我正试图逃避一个循环。基本上,如果满足“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 >>
                }
            }
        }
    }
}

7 个答案:

答案 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)

breakgoto

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
}