我有一个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
......
答案 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)
您需要与foreach
和while
分开,如下所示:
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
为例。