VB.NET - Como passar para o próximo item a For Each Loop?


93

Existe uma instrução semelhante Exit For, exceto que em vez de sair do loop, ela apenas se move para o próximo item.

Por exemplo:

For Each I As Item In Items

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

    ' Do something

Next

Eu sei que poderia simplesmente adicionar um Elseà instrução If para que fosse lido da seguinte forma:

For Each I As Item In Items

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

Next

Gostaria de saber se há uma maneira de pular para o próximo item da Itemslista. Tenho certeza de que a maioria estará perguntando por que não apenas usar a Elseinstrução, mas, para mim, embrulhar o código "Do Something" parece ser menos legível. Especialmente quando há muito mais código.

Respostas:



48

Eu usaria a Continuedeclaração em vez disso:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Observe que isso é ligeiramente diferente de mover o próprio iterador - qualquer coisa antes de Ifserá executado novamente. Normalmente é isso que você deseja, mas se não, você terá que usar GetEnumerator()e então MoveNext()/ Currentexplicitamente ao invés de usar um For Eachloop.


4

A respeito:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

Quero deixar claro que o código a seguir não é uma boa prática. Você pode usar o rótulo 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
Você poderia, mas por favor não.
MiseryIndex

Devido ao salto, pois é ruim.
Syed Tayyab Ali

4
Se não for uma boa prática e houver uma solução claramente melhor que a linguagem suporta (Continuar para / Retomar a seguir), talvez esta resposta deva ser removida voluntariamente.
eniacAvenger

Stackoverflow permite várias respostas com o objetivo de explorar a gama de opções disponíveis. Concordo que é uma opção ruim, mas é uma opção. Então eu acho que vale a pena ser incluído para ser completo.
Jeff

0

Quando tentei Continue Forcom falha, recebi um erro do compilador. Enquanto fazia isso, descobri 'Resume':

For Each I As Item In Items

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

    'Do something

Next

Observação: estou usando o VBA aqui.


2
Este código nem funciona em VBA. Resume Nexté para tratamento de erros não estruturados.
Daniel

Você precisa usar uma grande instrução IF para envolver todo o final do loop em VBA porque não há instrução continue. EntãoIf I <> x Then
HackSlash

0

Apenas o "Continue For" é um padrão aceitável (o resto leva ao "código spaghetti").

Pelo menos com "continue for" o programador sabe que o código vai diretamente para o topo do loop.

Para os puristas, porém, algo assim é melhor, pois é um código puro "não espaguete".

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

Para facilitar a codificação, porém, "Continue For" está OK. (É uma boa ideia comentar isso).

Usando "Continuar para"

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.