如何在foreach循环中留下while循环

时间:2013-02-19 13:08:48

标签: c# foreach switch-statement

我有一个while循环,在while loop内,我有一个foreach loop

Here我学会了如何使用Continue; Return; Break跳过循环上的当前互动。但是当我在while loop内时,我需要离开foreach loop吗?

我正在进行foreach loop内部的互动,我想离开foreach并转到while的下一次互动。我该怎么办? 像这样:

while (!reader.EndOfStream)  //COMEÇO DO WHILE
{
  ///Some Codes

  foreach(string s in checkedlistbox1.items)
        {
          switch(s)
           {
             case "1":
                if( 1 > 0)
                 {
                    ///HERE I WANT TO GO TO THE NEXT INTERACTION OF THE WHILE
                    ///When I use CONTINUE; HERE, I GO TO THE NEXT INTERACTION OF THE FOREACH. BUT I NEED TO GO TO THE NEXT OF THE WHILE.
                 }
           }
        }
}

这是我想做的事情: 我正在逐行读取file.txt,并用这些值和其他一些东西写一个新的...其中一些值可能是required(由用户选择),如果是{{1}是空的,所以我什么都不做,然后转到下一个required field ......

8 个答案:

答案 0 :(得分:4)

你需要从开关中断开,然后从foreach中断,同时设置变量。

然后,您可以检查该变量,看看是否应continue进行下一次while次迭代。

这样做:

while (!reader.EndOfStream)
{
    // Some Codes

    bool skipToNext = false;

    foreach (string s in checkedlistbox1.items)
    {
        switch (s)
        {
            case "1":
                if (1 > 0)
                {
                    skipToNext = true;
                    break;
                }
        }

        if (skipToNext) break;
    }

    // in the case of there being more code, you can now use continue
    if (skipToNext) continue;

    // more code
}

此流程的示例

var list = new List<string> { "0", "1", "2" };
int a = 0, b = 2;

while (a++ < b)
{
    // Some Codes

    bool skipToNext = false;

    foreach (string s in list)
    {
        Debug.WriteLine("{0} - {1}", a, s);

        switch (s)
        {
            case "1":
                if (1 > 0)
                {
                    Debug.WriteLine("Skipping switch...");
                    skipToNext = true;
                    break;
                }
        }

        if (skipToNext)
        {
            Debug.WriteLine("Skipping foreach...");
            break;
        }
    }

    // in the case of there being more code, you can now use continue
    if (skipToNext)
    {
        Debug.WriteLine("Skipping to next while...");
        continue;
    }

    // more code
}

输出:

1 - 0
1 - 1
Skipping switch...
Skipping foreach...
Skipping to next while...
2 - 0
2 - 1
Skipping switch...
Skipping foreach...
Skipping to next while...

答案 1 :(得分:1)

1)是的,这是可能的。它有效。

 foreach() {
    while() {
       break; //leave the while
    }
    //... and continues from here
 }

2)每次都会在下一次foreach迭代之前结束,所以第二个问题没有多大意义......除非你的意思是在foreach内部开始下一个问题,在这种情况下......是的!

 foreach() {
    while() {
       ...
    }
    break; //will go to the next foreach iteration, i.e. starts a new while
 }

至于你的代码示例,你在评论中提到的点的中断将完成你所需要的(退出foreach,在迭代时自然地进入下一个)。

编辑:发布示例之后,看来你的问题不在于while和foreach之间的交互,而是在switch:break被用作关键词“转到循环中的下一个迭代”和“完成这个案子和开关”。

编译器会将中断视为“切换中断”。你需要自己模仿行为:

    foreach(string s in checkedlistbox1.items)
    {
      bool dobreak = false;
      switch(s)
       {
         case "1":
            if( 1 > 0)
             {
                dobreak = true;
             }
             break; // exit the case
       }
       if (dobreak)
          break; // exits the for (it is a 'foreach-break')
    }

答案 2 :(得分:1)

bool dobreak = false;
while (!reader.EndOfStream && !dobreak )  //COMEÇO DO WHILE
{
  ///Some Codes

  foreach(string s in checkedlistbox1.items)
        {
          switch(s)
           {
             case "1":
                if( 1 > 0)
                 {
                    dobreak = true;
                    break;
                 }
           }
        }
}

答案 3 :(得分:0)

未经测试,但这些是应该回答您问题的几种可能方式:

bool continueLooping = true;

string[] array = { "1", "2" };

while (continueLooping)
{
    foreach (string x in array)
    {
        // break out of foreach loop AND while loop
        if (x == "1")
        {
            continueLooping = false;
            break;
        }

        // go to next iteration of foreach loop
        if (x == "2")
        {
            continue;
        }

        // break out of foreach loop and continue while loop
        if (x == "3")
        {
            break;
        }
    }
}

答案 4 :(得分:0)

您需要与foreachwhile分开,如下所示:

bool abort = false;
while (!reader.EndOfStream && !abort)  //COMEÇO DO WHILE
{
  ///Some Codes

  foreach(string s in checkedlistbox1.items)
        {
          switch(s)
           {
             case "1":
                if( 1 > 0)
                 {
                    ///HERE I WANT TO LEAVE TO THE NEXT INTERACTION OF THE WHILE
                    abort = true;
                    break;
                 }
           }

           if (abort)
           {
               break;
           }
    }
}

答案 5 :(得分:0)

我是C#的初学者,但我建议您为while循环添加另一个条件,您可以自己设置。然后,在需要时更改它。例如:

MyKeyCondition = 0;

while(MainCondition||MyKeyCondition){

if(MyCheckCondition){
MyKeyCondition = 1;
}

}

现在,如果更改键条件,即使不满足主要条件,也可以处理while循环。

答案 6 :(得分:0)

可以尝试goto;

while (true)
{
 foreach(string s in checkedlistbox1.items)
  {
   switch(s)
   {
     case "1":
        if( 1 > 0)
        {
          goto WhileOut;
        }
    }
  }
}
WhileOut:
      // some code

答案 7 :(得分:0)

通常嵌套循环表示应该拆分方法。

在这个例子中,它可以使代码更清晰。如果将内部for循环放入单独的方法中,则可以使该方法返回bool。如果您希望外部true循环继续迭代,请返回while;否则,如果您希望退出false循环,请返回while

它看起来像这样:

private void doSomething(StreamReader reader)
{
    while (!reader.EndOfStream)
    {
        // Some Codes...

        if (!processNextItem(reader))
        {
            break;
        }
    }
}

// Returns true if the caller should continue its while loop; false if it should exit it.

private bool processNextItem(StreamReader reader)
{
    foreach (string s in checkedlistbox1.items)
    {
        switch (s)
        {
            case "1":
                if (1 > 0)
                {
                    return false; // Return false to exit while loop.
                }
        }
    }

    return true; // Return true to continue while loop.
}

我不确定你需要传递给processNextItem();我刚刚以reader为例。