从嵌套的 for 循环继续 while

Posted

技术标签:

【中文标题】从嵌套的 for 循环继续 while【英文标题】:Continue while from nested for-loop 【发布时间】:2014-10-16 11:17:34 【问题描述】:

我有以下循环结构:

while ($reader.Read() -eq $true)

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

现在,是否有任何方法可以从 for 循环内部继续进行外部 while 循环的下一次迭代,而无需任何中断变量?所以如果“某事是真的”我不想去#do more stuff,而是去下一个$reader.read()Continue 只进入 for 循环的下一次迭代。 Break 只会破坏for 循环。

【问题讨论】:

【参考方案1】:

将内部循环分解为函数可以提高可读性,具体取决于变量的复杂程度。

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...          

【讨论】:

谢谢,那些带标签的休息似乎可以解决问题 - 虽然感觉有点像旧的 GOTO :) 带标签的中断是 Donald Knuth 所说的“结构化GOTO”——您不能将执行转移到任意位置,只能转移到明确定义的位置(即循环的末端)。为了加强这一点,PowerShell 甚至没有 GOTO 语句,这对于脚本语言来说是相当罕见的。 只是一个小编辑:这是continue nextRow not break :nextRow 你说得对——break :nextRow 将从for 内部终止外循环,这不是我们想要的(在这种情况下,它也很有用)。 对我来说 continue nextRow 仅在没有 : 的情况下有效 使用 : 它将继续 for 循环【参考方案2】:

编辑:修改后的递归(且未经测试!)解决方案,因此您的 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

【讨论】:

是的,这就是我所说的“额外的中断变量”。我目前正在使用它,但正在寻找更好的方法;) @silent,试一试编辑后的答案。递归当然更优雅 我不会在脚本语言中使用递归,因为我不希望我未来的维护者理解它——我非常喜欢我未来的维护者。

以上是关于从嵌套的 for 循环继续 while的主要内容,如果未能解决你的问题,请参考以下文章

在嵌套的 while 循环中继续

js中循环嵌套

更快的理解js中循环嵌套

python for和while循环杂记

自学Python入门 (for和while)循环嵌套及用法

JS中for循环嵌套打印100以内3的倍数?