是否有可能突破循环或继续从外部方法进行下一次迭代?

时间:2014-09-28 07:51:58

标签: c# loops break continue

我有一个验证方法,我在循环中调用它。 如果验证失败,我想调用“继续”。 有没有办法从验证方法中调用“继续”? 我只是不想在循环中的这么多地方叫“继续”...

4 个答案:

答案 0 :(得分:1)

不,流控制语句仅影响定义它们的块。唯一的内置方法是从堆栈中进一步改变控制流,这是一个例外,这对你正在做的事情来说肯定是错误的机制。

如果你被所有continue所困扰,我建议你考虑采用更具说服力的思维方式。像这样定义验证循环的主体:

bool IsValid(Foo foo) {
    if (Condition1(foo)) {
        return false;
    }

    if (Condition2(foo)) {
        return false;
    }

    // ... and so on
}

然后像这样验证:

if (!foos.All(IsValid)) {
    // One of your foos is invalid
}

LINQ扩展方法All和Any会尽快中断执行,这意味着All会在找到第一个不满足条件的时候停止,Any会在找到第一个时停止。

答案 1 :(得分:1)

你的周期中有很多continue,它会变得很烦人。您无法继续使用外部方法,因为它超出了范围。实际上有几种解决方案:

  1. 您可以从验证方法返回一个布尔值,然后按原样使用它:

    if (!IsValid()) { continue; }

  2. 但是没有用,因为你仍然会有continue s。

    1. 您可以将验证放在循环的开头,并且可以使用标志来确定迭代是否应该逐步执行,初始化为false:

      while (myCondition) { stepOut = false; //validation region, you set stepOut to false if a validation fails if (!stepOut) { //operations } }

    2. 您可以将所有验证调用包装到方法中,让我们称之为myValidation,然后:

      while (myCondition) { if (myValidation()) { //operations } }

    3. while (myCondition) { if (!IsValid()) { //continue } }

      1. 您可以抛出Exception,但不要这样做。

答案 2 :(得分:0)

只要在验证方法返回的地方返回false,然后检查验证方法是否返回false,在调用函数中断开循环。

答案 3 :(得分:0)

为什么不呢?

编程中的黄金法则:“总有办法”。

C ++允许您内联汇编语言语法。与此类似,C#也支持它。让我考虑你的例子。

    void method1(){
      foreach(var x in y)
      {
          Validate(x);
          ...
          //Your other logic
          ...

        EndOfLoop:
          ;
      }
    }
    ..
    ..
    void Validate(T x)
    {
    #if IL
      br EndOfLoop
    #endif
    }
//End Of Code

这将从您的代码中的任何位置“跳转”到“EndOfLoop”标签。根据您的代码,这可能是一种不好的做法..