2014-10-16 99 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