【问题标题】:Which loop to use, for or do/while?使用哪个循环,for 或 do/while?
【发布时间】:2009-08-25 10:16:10
【问题描述】:

使用 C#(或 VB.NET)在需要计数器时应该使用哪个循环(for 循环或 do/while 循环)?

如果循环应该只迭代设定的次数或通过设定的范围,会有什么不同吗?

场景 A - for 循环

for (int iLoop = 0; iLoop < int.MaxValue; iLoop++)
{
  //Maybe do work here

  //Test criteria
  if (Criteria)
  {
    //Exit the loop
    break;
  }

  //Maybe do work here
}

优势

  • 计数器被声明为循环的一部分
  • 易于实施计数器范围

缺点

  • 必须使用 if 才能离开循环

场景 B - do/while 循环

int iLoop = 0;
do
{
  //Increment the counter
  iLoop++;

  //Do work here
} while (Criteria);

int iLoop = 0;
while (Criteria)
{
  //Increment the counter
  iLoop++; 

  //Do work here 
}

优势

  • 离开循环是循环结构的一部分
  • 选择在循环块之前或之后进行评估

缺点

  • 必须手动管理计数器

【问题讨论】:

  • 我想知道为什么每个人都在他们的答案中不断复制iLoop &lt; int.MaxValue 部分,而这显然总是正确的......
  • 应该更改标题以添加“while”循环
  • @Luis Filipe - While 循环在标题中!
  • @Stevo3000:我建议“使用哪个循环,for、While 还是 do/while?”
  • @Luis Filipe - 问题是指做/同时表示做或同时。我认为没有任何真正需要分开他们。

标签: c# loops


【解决方案1】:

为了完整起见,您也可以使用选项 D:

for (int iLoop = 0; Criteria; iLoop++)
{
   // work here
}

(其中Criteria 是“继续运行”)

for 循环中的条件不必涉及iLoop。虽然不寻常,但很可爱 - 不过,只评估工作之前。

【讨论】:

  • 所以 for 循环可以复制 while 循环而不需要 if,但是 for 循环需要 if 才能复制 do 循环!
  • 甚至可能不写 iLoop++,因为 Criteria 可能不依赖于 iLoop
  • 嗯,建议需要计数器,保持增量远离代码的“肉”就好了。
  • @Luis Filipe - @Marc 是正确的,计数器是问题的一部分。
【解决方案2】:

两全其美怎么样:

for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++)

编辑:现在我想起来了,我想与 int.MaxValue 进行比较不是标准的一部分,而是模拟无限 for 循环的东西,在这种情况下你可以使用:

for (int iLoop = 0; !Criterea; iLoop++)

【讨论】:

  • 除了他说在检查标准之前可能需要做一些工作
  • @Daphna Shezaf:你说得对,但如果你想在检查前后做一些工作,你仍然需要在 while 循环中加入 if 条件
  • @Firas - 但如果您只想检查循环体之后的条件(执行循环),则不行。我确实喜欢这种结构。
  • @Stevo3000:是的,这取决于你想做什么。我指的是您的 for 循环示例,其中您在检查标准之前和之后都有“可以在这里工作”的 cmets。
  • 您可以将条件更改为:“(iLoop
【解决方案3】:
for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++) {
    //Do work here...
}

【讨论】:

    【解决方案4】:

    您可以使用您想要用于循环的实际条件,而不是 for 循环中的虚拟条件:

    场景 A2 - 带有自定义条件的 for 循环:

    for (int iLoop = 0; Criteria; iLoop++) {
    
      // do work here
    
    }
    

    这相当于:

    {
       int iLoop = 0;
       while (Criteria) {
    
          // do work here
    
          iLoop++;
       }
    }
    

    如果你有一个循环计数器,你通常应该使用一个 for 循环来使其更清晰。

    【讨论】:

      【解决方案5】:

      我通常使用 for,因为它很简单。当在循环之后或之前需要计数器时,或者如果无法使用 for 时,我会使用 while。

      【讨论】:

        【解决方案6】:

        您可以随时将退出条件添加到 for 循环中:

        for (int iLoop = 0; iLoop < int.MaxValue && Criteria; iLoop++)
        {
          //Maybe do work here
        }
        

        我真的会选择在您的特定情况下看起来最易读的任何东西。

        【讨论】:

          【解决方案7】:

          在这种情况下,没有理由不使用for 循环。即使您有其他标准,也可以这样写:

          for (int iLoop = 0; iLoop < int.MaxValue && Criteria; iLoop++) { ... }
          

          【讨论】:

            【解决方案8】:

            for 循环包含以下内容:

            for ( initialization; condition; action )
            

            你不需要额外的 if 来检查你的标准,你认为i &lt; value 是什么?这只不过是一个标准。

            我在适合问题时使用循环,没有明确的答案

            【讨论】:

              【解决方案9】:

              编写一些测试用例,看看哪个最适合你。看看这个链接:.Net/C# Loop Performance Test (FOR, FOREACH, LINQ, & Lambda)

              【讨论】:

                【解决方案10】:

                我个人会选择 for 循环

                更好阅读,更常用,也很优化。

                for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++)
                {
                // Do Work
                }
                

                编辑:int.MaxValue && !Criteria

                【讨论】:

                • ++iLoop 或 iLoop++ 在 C# 中没有区别,这将编译为相同的 IL。如果你不相信我,试试看。
                • -1 有关 ++ 的错误信息。在这种情况下,它永远不会创建临时变量(通常也几乎不会)。
                • 我不同意;预增量运算符相对较少,在 C# 中没有提供明显的性能改进。您无缘无故地增加了不确定性/混乱。
                • 编辑了答案,感谢您让我知道 - 不知道这在 C# 中无关紧要 - 在工作中我被告知在迭代器之前使用 ++...
                • 整数不是迭代器对象。
                【解决方案11】:

                如果我实际上在循环中使用计数器,我倾向于使用for,比如作为数组的索引,并且作为标准的一部分,即“在数组末尾停止”而不是而不是“只是不要溢出”。

                如果我要循环一些长度未知的内容,例如文件中的行,或者只是在循环后维护计数器以使用总数,那么我将使用 dowhile

                但是,这实际上归结为在特定情况下更具可读性。我希望您很难从编译后的 IL 中分辨出使用了哪个版本。

                【讨论】:

                  【解决方案12】:

                  ((((b/w while 和 do while 的区别-->让我用一个例子告诉你: 如果一个人进入大厅修理大厅内的炸弹,他必须在进入时进行检查。如果一个人进入大厅从那里偷东西,他必须在离开大厅时进行检查..所以基于这个过程,我们只需要使用我们的循环条件....))))

                  for 循环可以执行一段代码固定或给定的次数。如果您的计数器变量依赖于该代码块(意味着在循环条件内),您可以使用 for 循环

                  【讨论】:

                    【解决方案13】:

                    至少对我来说,当我需要遍历数组并且不需要中断时,我会使用 for()。当我需要处理未知时间的东西时,do() 和 while()。

                    【讨论】: