VB.NET-如何移至下一个项目“每个循环”?


93

是否有类似的陈述Exit For,除了没有退出循环,它只是移至下一项。

例如:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    End If

    ' Do something

Next

我知道可以简单Else地在If语句中添加一个,因此其内容如下:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    Else
        ' Do something
    End If

Next

只是想知道是否有一种方法可以跳到Items列表中的下一项。我敢肯定,大多数人都会正确地问为什么不仅仅使用该Else语句,而是对我来说包裹“ Do Something”代码似乎不太可读。尤其是当有更多代码时。

Answers:



48

我会改用以下Continue语句:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

请注意,这与继续运行迭代器本身略有不同-之前的任何操作都If将再次执行。通常这是您想要的,但如果不是,则必须先使用/ GetEnumerator()然后显式使用,而不是使用循环。MoveNext()CurrentFor Each


4

关于什么:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

我想清楚的是,以下代码不是一个好习惯。您可以使用GOTO标签:

For Each I As Item In Items

    If I = x Then
       'Move to next item
        GOTO Label1
    End If

    ' Do something
    Label1:
Next

23
您可以,但请不要。
MiseryIndex

由于跳动,因此是不好的。
Syed Tayyab Ali

4
如果不是很好的做法,并且该语言支持一种明显更好的解决方案(继续/继续下一步),则可能应自愿删除此答案。
eniacAvenger 2015年

Stackoverflow允许多个答案,以探索可用选项的范围。我同意这是一个不好的选择,但这是一个选择。因此,我认为值得将其纳入完整性。
杰夫,

0

当我尝试Continue For失败时,出现编译器错误。在执行此操作时,我发现了“恢复”:

For Each I As Item In Items

    If I = x Then
       'Move to next item
       Resume Next
    End If

    'Do something

Next

注意:我在这里使用VBA。


2
此代码甚至在VBA中都不起作用。Resume Next用于非结构化错误处理。
丹尼尔(Daniel)

您必须使用一个较大的IF语句将循环的整个结尾包装在VBA中,因为没有继续语句。所以If I <> x Then
HackSlash

0

只有“ Continue For”是可接受的标准(其余的将导致“ spaghetti code”)。

至少通过“ continue for”,程序员知道代码直接进入循环的顶部。

对于纯粹主义者来说,最好是这样,因为它是纯“非意大利面条”代码。

Dim bKeepGoing as Boolean 
For Each I As Item In Items
  bKeepGoing = True
  If I = x Then
    bKeepGoing = False
  End If
  if bKeepGoing then
    ' Do something
  endif
Next

为了便于编码,“继续”是可以的。(虽然对此发表评论是个好主意)。

使用“继续”

For Each I As Item In Items
  If I = x Then
    Continue For   'skip back directly to top of loop
  End If
  ' Do something
Next
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.