2013-02-19 76 views
1

我有一個while循環,並在此while loop我有一個foreach loop如何在foreach循環內留下while循環

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(由用戶seted),如果一個required field是空的,所以我什麼也不做,然後去下一個while interaction ...

+3

一些代碼示例將會很完美... – 2013-02-19 13:10:23

+0

參考http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective- c, 它與你需要的相似 – Cris 2013-02-19 13:11:04

+0

如果你用你的循環發佈了一些代碼並解釋你想要破解的地方以及什麼條件,那將會很有幫助。 – ryadavilli 2013-02-19 13:11:18

回答

4

您需要從開關打破,然後從在foreach,而具有可變集。

然後,您可以檢查該變量,看看您是否應該continue到下一個while迭代。

做這樣的:這個流程工作

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 
} 

產出

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 
} 

例子:

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

我不想離開,而只是去下一個互動的時間; x這種方法做到這一點 – Ghaleon 2013-02-19 13:19:11

+0

沒有,但它可以做,讓我更新它... – 2013-02-19 13:19:52

+0

查看更新的代碼。 – 2013-02-19 13:20:44

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中用作「去循環中的下一個迭代」和「完成這個案例和開關」。

編譯器會將break視爲'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') 
    } 
+0

我用代碼更新了我的問題,希望我能清楚。 – Ghaleon 2013-02-19 13:12:10

+0

哦,我明白了!沒有代碼,我得到了另一種方式(foreach/while)。相同的推理適用,但 – 2013-02-19 13:13:47

+0

@Ghaleon我讀你的編輯,問題是休息(這將配對交換機,而不是foreach)。我將編輯我的答案 – 2013-02-19 13:17:52

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; 
       } 
      } 
     } 
} 
+1

這將退出foreach和while ...我懷疑OP不想退出這個時間段。 – 2013-02-19 13:16:11

+0

什麼是OP?我不想離開'while'只是進入下一個'while'的相互作用; x這個方法做到了嗎? – Ghaleon 2013-02-19 13:18:36

+0

OP =原始海報/帖子(即啓動線程的人或消息) – 2013-02-19 13:21:34

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; 
     } 
    } 
} 
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; 
      } 
    } 
} 
0

我是C#初學者,但我建議你添加另一個條件到while循環,你可以自己設定。然後,只要需要就更改它。例如:

MyKeyCondition = 0; 

while(MainCondition||MyKeyCondition){ 

if(MyCheckCondition){ 
MyKeyCondition = 1; 
} 

} 

現在,如果更改了關鍵條件,即使主條件不滿足,也可以處理while循環。

0

可能嘗試goto;

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

通常嵌套循環是的指示方法應該是分手了。

在這個例子中,它可以使代碼更清晰。如果將內部for循環放入單獨的方法中,則可以使該方法返回bool。如果您希望外部的while循環繼續迭代,則返回true;否則,如果您希望它退出while循環,請返回false

這將是這個樣子:

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爲例。

+0

它看起來非常漂亮' - '我不知道...我會盡力做到這一點,問題是我的代碼現在非常「大」。我會做一些測試,只要我得到一個結果,我會在這裏發佈,我會繼續在這裏檢查。 – Ghaleon 2013-02-19 13:33:07

+0

如果你的功能非常大,那麼更有理由將它們分開。你會得到很多長期收益的短期痛苦。 :) – 2013-02-19 13:47:33

+0

是的,你是對的......我只是害怕把所有的事情都試圖改變= s我會做一個備份並嘗試! – Ghaleon 2013-02-19 14:05:37