【问题标题】:Equivalent of Ruby "redo" in C#相当于 C# 中的 Ruby“重做”
【发布时间】:2013-01-10 21:30:30
【问题描述】:

在 C# 中是否有等效的方法来执行 redo 的工作?即返回循环顶部并重新执行而不检查条件或增加循环计数器。谢谢。

【问题讨论】:

  • @Saju continue 仍会增加​​循环计数器..
  • 我知道。我的意思是让 OP 尝试使用continue。这不是一个答案,只是一个评论:)
  • 不幸的是,我需要计数器保持不变,因为我在迭代时想要处理整个集合,而不仅仅是那些不抛出异常的集合。

标签: c# .net ruby loops for-loop


【解决方案1】:

为什么不简单:

虽然goto 并不是每个人都喜欢,但在这种情况下它的可读性很强...

for(...)
{
redo:

   //...

   if (...)
      goto redo;




}

【讨论】:

  • @TylerLong:这才是最重要的,不是吗?
【解决方案2】:
for (int i = 0; i < 100; i++)
{
    do
    {
        DoYourStuff();
    } while (ShouldWeDoThatAgain());
}

Do...while 就像一个标准的while 循环,除了不是在每次迭代之前检查它的条件,而是在之后检查。这样,循环内的代码将始终至少执行一次。将其粘贴在forforeach 循环中,这应该可以让你得到你想要的行为。这比 Simon 的回答要简单一些,因为它不需要额外的变量,不使用 continue,并且根本不会弄乱循环计数器。

【讨论】:

    【解决方案3】:

    没有。你会得到最接近的是这样的:

    bool redoCalled = false:
    
    for (int i = 0; i < 10; i++) {
        if (redoCalled) {
            i--;
            redoCalled = false;
        }
    
        // other stuff here
    
        if (redoWanted) {
            redoCalled = true;
            continue;
        }
    }
    

    【讨论】:

    • 如果在最后一个循环中设置了 redoCalled,这将不起作用。您需要在循环结束时递减 i。
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2011-04-29
    • 2021-11-27
    • 2014-02-19
    相关资源
    最近更新 更多