2012-07-26 49 views
1

我想從if語句中跳過List<T>.ForEach()循環的迭代。如何從列表中跳出<T> .ForEach()循環來自C#中的if語句內部

我的代碼:

 instructions.ForEach(delegate(Instruction inst) 
     {     
      if (!File.Exists(inst.file)) 
      { 
       continue; // Jump to next iteration 
      } 

      Console.WriteLine(inst.file); 
     }); 

但是編譯器指出沒有任何東西可以跳出(大概是因爲它似乎走,如果塊作爲封閉塊?)。

有沒有辦法做到以上?喜歡的東西parentblock.continue;

感謝

+2

什麼是錯的或循環的foreach應用謂詞? – 2012-07-26 15:37:32

+1

這不是你的問題的答案,但爲什麼不只是使它成爲一個積極的檢查,並在if中移動你的邏輯? 'if(File.Exists){do stuff}'而不是如果不繼續? – MNGwinn 2012-07-26 15:39:19

回答

8

使用return語句而不是continue。請記住,通過使用ForEach擴展方法,您正在爲每個項目執行一個函數,其中的主體在{和}之間指定。通過退出該功能,它將繼續使用列表中的下一個值。

+0

這樣做,謝謝。 – 2012-07-26 15:50:10

+0

如果它不存在,則不要返回,而應該在不存在時打印它。 – Servy 2012-07-26 16:20:30

5

ForEach在這種情況下只是執行列表中每個項目的委託的方法。它不是一個循環控制結構,所以continue不能出現在那裏。重寫它作爲一個正常的foreach循環:

foreach (var inst in instructions) { 
    if (!File.Exists(inst.file)) 
    { 
     continue; // Jump to next iteration 
    } 

    Console.WriteLine(inst.file); 
} 
+1

謝謝,我試圖使用原來的方法,因爲它超出了我的舒適區域和良好的學習曲線。 – 2012-07-26 15:51:27

+0

@RodgersandHammertime很多專家認爲它[不被認爲是一種好的做法](http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx)。說實話,我會阻止你使用它。不要想方設法以困難的方式完成簡單的事情,而是尋求以簡單的方式完成艱辛的事情的方法。 – Servy 2012-07-26 16:17:49

1

發送到給ForEach功能將在指令列表中每個項目的運行一次的委託。爲了跳過一個項目,只需從委託函數返回。

instructions.ForEach(delegate(Instruction inst) 
    {     
     if (!File.Exists(inst.file)) 
     { 
      return; // Jump to next iteration 
     } 

     Console.WriteLine(inst.file); 
    }); 
5

使用LINQ的WHERE子句從發病

foreach(Instruction inst in instructions.Where(i => File.Exists(i.file))){ 
    Console.WriteLine(inst.file); 
} 
+0

嘿,不錯,但不應該是OP選擇的解決方案;-) – tomfanning 2012-07-26 15:45:11

+0

謝謝,就像它 – 2012-07-26 15:48:02