2014-10-16 117 views
2

我有以下環結構:繼續,同時從嵌套的循環

while ($reader.Read() -eq $true) 
{ 
    $row = @{} 
    for ($i = 0; $i -lt $reader.FieldCount; $i++) 
    { 
     if(something...) 
     { 
      #continue with while 
     } 
    } 
    #do more stuff...   
} 

現在,有沒有辦法從for循環與外循環while的下一次迭代中繼續沒有任何BREAK-變量?所以如果「某事是真的」,我不想去#do more stuff,而是做下一個$reader.read()Continue僅進入for循環的下一次迭代。 Break只會打破for循環。

回答

6

分解出的內環的功能,可以提高可讀性,這取決於如何糾結了你的變量是。

function processRow($reader) { 
    $row = @{} 
    for ($i = 0; $i -lt $reader.FieldCount; $i++) 
    { 
     if(-not something...) { return $null } 
     # process row 
    } 
    $row 
} 

while ($reader.Read()) { 
    $row = processRow $reader 
    if ($row) { 
     #do more stuff...   
    } 
} 

但是,如果你想直接做到這一點,就可以了,因爲PowerShell有標記符:

:nextRow while ($reader.Read()) { 
    $row = @{} 
    for ($i = 0; $i -lt $reader.FieldCount; $i++) { 
     if(something...) { 
      #continue with while 
      continue nextRow 
     } 
    } 
    #do more stuff...   
} 
+0

謝謝,那些標準的休息似乎在伎倆 - 雖然它感覺有點像舊的GOTO :) – silent 2014-10-16 15:12:43

+0

Donald Knuth會稱之爲「結構化的GOTO」「 - 你不能將執行轉移到任意位置,只能明確定義的(即循環的結尾)。爲了加強這一點,PowerShell甚至沒有'GOTO'語句,這對於腳本語言來說是非常罕見的。 – 2014-10-16 15:18:57

+0

只是一個小小的編輯:它繼續nextRow沒有中斷:nextRow – silent 2014-10-16 15:21:01

0

編輯:修訂,遞歸(!和未經測試)解決方案,使您的millage可能會有所不同:

function doReader() 
{ 
    while ($reader.Read() -eq $true) 
    { 
     $row = @{} 
     for ($i = 0; $i -lt $reader.FieldCount; $i++) 
     { 
      if(something...) 
      { 
       #continue with while 
       doReader 
       break; 
      } 
     } 
    } 
} 
doReader 
#do more stuff 
+0

是啊,這就是我的意思與「額外的休息變量」。我目前正在使用它,但正在尋找更好的方法;) – silent 2014-10-16 11:36:50

+0

@silent,給編輯答案一個鏡頭。遞歸當然更優雅 – Raf 2014-10-16 13:34:22

+0

我不會在腳本語言中使用遞歸,因爲我不期望我的未來維護者能夠理解它 - 而且我對未來的維護者充滿了喜愛。 – 2014-10-16 15:10:56