继续在嵌套的for循环中执行

6
我有以下循环结构:
while ($reader.Read() -eq $true)
{
    $row = @{}
    for ($i = 0; $i -lt $reader.FieldCount; $i++)
    {
        if(something...)
        {
            #continue with while
        }
    }
    #do more stuff...          
}

现在,有没有任何方法可以在不使用任何break变量的情况下从for循环内部继续执行外部while循环的下一个迭代?因此,如果"something is true",我不想继续执行"#do more stuff",而是执行下一个"$reader.read()"。 "Continue"只会跳转到下一个for循环迭代。"Break"只会中断for循环。
2个回答

12

如果变量太过错综复杂,将内部循环提取为一个函数可能会提高可读性。

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 :) - silent
1
标记的中断是Donald Knuth所谓的“结构化GOTO”——您不能将执行转移到任意位置,只能转移到明确定义的位置(即循环的末尾)。为了加强这一点,PowerShell甚至没有GOTO语句,这在脚本语言中相当罕见。 - Jeroen Mostert
只是一个小修改:应该是 continue nextRow 而不是 break :nextRow - silent
你说得完全正确-- break :nextRow 会从 for 循环内部终止外部循环,这不是我们想要的(在这种情况下,但它也很有用)。 - Jeroen Mostert
对我来说,continue nextRow 只有在没有 : 的情况下才能正常工作。如果加上 :,它将继续执行 for 循环。 - silent
我遵循了TechNet文档(http://technet.microsoft.com/en-us/library/hh847873.aspx)中的说明,但当我查阅PowerShell实际帮助时,发现冒号确实被省略了。 - Jeroen Mostert

0

编辑:一个修订过的、递归的(未经测试!)解决方案,因此您的结果可能会有所不同:

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
@silent,试试修改后的答案。递归确实更加优雅。 - Raf
1
我不会在脚本语言中使用递归,因为我不希望我的未来维护者无法理解它——我这么说并不是不喜欢我的未来维护者。 - Jeroen Mostert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接