如何在扩展方法中使用“继续”和“中断”

本文关键字:继续 中断 扩展 方法 | 更新日期: 2023-09-27 18:03:06

我定义了以下扩展方法:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
   foreach (T obj in sequence)
   { 
      action(obj); 
   } 
}

然后我可以将其用作:

new [] {1, 2, 3} // an IEnumerable<T>
.ForEach(n => 
{
  // do something 
});

我希望能够在我的扩展方法中利用continuebreak,以便我可以执行以下操作:

new [] {1, 2, 3}
.ForEach(n => 
{
    // this is an overly simplified example
    // the n==1 can be any conditional statement
    // I know in this case I could have just used .Where
    if(n == 1) { continue; }
    if(n == -1) { break; }      
    // do something 
});

这些关键字只能在forforeachwhiledo-while循环中使用吗?

如何在扩展方法中使用“继续”和“中断”

这些关键字只能在 for、foreach 和 while 循环中使用吗?

是的。这些语句仅限于循环类型。正如文档所说:

continue 语句将控制权传递给 将 while、do、for 或 foreach 语句括起来。

和:

break 语句终止最近的封闭环路或开关 它出现的语句。控制权传递给语句 跟在终止的语句后面(如果有(。

我建议你使用常规foreach,这是自我表达的。我认为任何在您的 ForEach 扩展方法中语义使用它们的尝试都会导致比使用常规循环更奇怪的代码。

我的意思是,这不是更简单吗?

var arr = new [] {1, 2, 3}
foreach (int number in arr)
{
    if(n == 1) { continue; }      
    if(n == -1) { break; }      
}

除了Yuval的回答之外,我还想补充一点,你可以实现这样的东西,如下所示:

Action<T>更改为采用T参数并返回bool结果的Func<T, bool>

"继续"情况可以通过在条件下从函数返回来轻松处理,从而继续循环的下一次迭代。

可以通过从指示是否继续的函数返回一个bool来处理"中断"情况:

public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action)
{
  foreach (T obj in sequence)
  { 
    if (!action(obj)) 
      break;
  }
}
new [] {1, 2, 3}.ForEach(n => 
{
    if(n == 1) { return true;}      
    if(n == -1) { return false; }  
    // do something 
    ...
    return true;
});

是的,这些关键字仅限于whiledoforforeach(如尤瓦尔所引用的(。

此代码与您询问的代码大致相同:

bool shouldBreak = false;
new [] {1, 2, 3}
.ForEach(n => 
{
    if (!shouldBreak)
    {
        if(n == 1) { /* no action */ }      
        else if(n == -1) { shouldBreak = true; }
        else
        {
            // do something 
        }
    }
});