【问题标题】:Is there a standard way to write a for loop that does not need an update statement?是否有一种标准方法来编写不需要更新语句的 for 循环?
【发布时间】:2014-04-18 22:14:35
【问题描述】:

众所周知,大多数 for 循环都采用这种形式:

for (int i = 0; i < whatever; i++)
{
    //do stuff
}

我正在编写一个方法,此时不适合以上述格式包含“i++”,因为 i 正在嵌套在此循环中的循环中进行更新。所以现在,我有这个:

List<Item> itemList = new List<Item>();
PopulateListOfItems(itemList);

List<List<Item>> itemSubListList = new List<List<Item>>();

for (int i = 0; i < itemList.Count; //i doesn't need updating here)
{
    List<Item> subList = new List<Item>();

    for (int j = 0; j < subListSize && i < itemList.Count; j++)
    {   
        subList.Add(itemList[i++]);
    }

    itemSubListList.Add(subList;
}

是否有编写这样一个循环的标准方法,可能包括某种虚拟代码,i++ 通常会在其中明确不需要更新?也许像......

for (int i = 0; i < whatever; true)
{
    //do stuff
}

...或者我刚刚结束了漫长的一周,我的大脑太煎熬而没有意识到我真的应该使用 while 循环或其他什么?

顺便说一句,我是用 C# 编写的,是的,但这可以适用于多种语言。

【问题讨论】:

  • 你可以省略它,但是你只是写了一个while循环。

标签: c# loops for-loop


【解决方案1】:

省略它:

for (int i = 0; i < whatever; )
{
    //do stuff
}

事实上,for-loop 的所有部分都是可选的(至少在 C# 中,这对于所有类 C 语言可能并不相同)。下面创建了一个无限循环:

for (;;)
{
    //do stuff
}

当然,您也可以使用while-loop 来完成此操作,正如其他答案所建议的那样。这两种解决方案都是完全有效的,您选择哪一种主要是风格问题。一般来说,您应该选择最能清楚地向读者传达代码试图做什么的解决方案。

【讨论】:

  • 嗯,它可能不是一个无限循环,这取决于//do stuff 所做的事情。它可能包含退出循环的break 语句。
  • @icemanind 正确。它与while (true) // do stuff 一样 无限。
  • 你为什么要这样做?很容易忽略它不是 for 循环的标准,它不再具有 for 循环的语义。变量范围更窄似乎也没有什么好的理由。
  • @DanielBrückner 任何for-loop 都可以重写为while-loop,反之亦然。恕我直言,for-loop 和 while-loop 之间的区别不仅在于语法,还在于它的通信意图。 for-loop 表达了非常有规律地迭代某个过程的想法,一次一小步,在那里你有一个众所周知的停止点。另一方面,while-loop 表示您将继续此过程直到满足条件,但语义要宽松得多。换句话说,我认为这取决于// do stuff 是什么。但正如我所说,两者都是有效的。
【解决方案2】:

只需使用while 循环而不是for 循环。

var i = 0;

while (i < whatever)
{
   // Do stuff including updating i.
}

【讨论】:

    【解决方案3】:

    for循环结构只是while循环的语法糖,所有for循环都分解为while循环。

    for(int i = 0; i < whatever; i++)
    {
        //do stuff
    }
    

    最终意味着:

    {
        int i = 0;
        while(i < whatever)
        {
            //do stuff
            i++;
        }
    }
    

    (注意用于整数范围的附加花括号)

    您省略的 for 循环的任何部分也会从分解的 while 循环中省略,因此您必须手动处理它们。如果你不使用所有三个部分,你真的可以只写一个while循环(特别是如果你省略的部分之一是变量初始化器,因为我提到了变量范围)。

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2019-02-22
      • 2021-07-01
      • 2018-12-05
      • 1970-01-01
      • 2011-07-25
      • 2011-01-21
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多