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.

Sean Taylor
fonte

Respostas:

178
For Each I As Item In Items
    If I = x Then Continue For

    ' Do something
Next
Adam Robinson
fonte
Obrigado, isso é exatamente o que eu estava procurando, engraçado como não está na documentação do MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Também parabéns por bater Jon na postagem, por 20 segundos inteiros! :)
Sean Taylor
9
Quase fui Skeeted novamente! ;)
Adam Robinson
É melhor você fechar a Ifdeclaração corretamente. É enganoso.
mchar
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.

Jon Skeet
fonte
4

A respeito:

If Not I = x Then

  ' Do something '

End If

' Move to next item '
timo2oo8
fonte
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
Syed Tayyab Ali
fonte
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.

Karmendra
fonte
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
Chris Raisin
fonte