VB.NET - ¿Cómo pasar al siguiente elemento a para cada bucle?

93

¿Hay una declaración como Exit For, excepto que en lugar de salir del bucle, simplemente pasa al siguiente elemento?

Por ejemplo:

For Each I As Item In Items

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

    ' Do something

Next

Sé que podría simplemente agregar un Elsea la declaración If para que se lea de la siguiente manera:

For Each I As Item In Items

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

Next

Me pregunto si hay una manera de saltar al siguiente elemento de la Itemslista. Estoy seguro de que la mayoría se preguntará correctamente por qué no usar la Elsedeclaración, pero para mí, envolver el código "Hacer algo" parece ser menos legible. Especialmente cuando hay mucho más código.

Sean Taylor
fuente

Respuestas:

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

    ' Do something
Next
Adam Robinson
fuente
Gracias, esto es exactamente lo que estaba buscando, es curioso cómo no está en la documentación de MSDN. ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) ¡También felicidades por vencer a Jon en la publicación, por 20 segundos completos! :)
Sean Taylor
9
¡Casi me Skeeted una vez más! ;)
Adam Robinson
Será mejor que cierre la Ifdeclaración correctamente. Es engañoso.
mchar
48

En su lugar, usaría la Continuedeclaración:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Tenga en cuenta que esto es ligeramente diferente a mover el iterador en sí, cualquier cosa antes de Ifque se ejecute nuevamente. Por lo general, esto es lo que desea, pero si no, tendrá que usar GetEnumerator()y luego MoveNext()/ Currentexplícitamente en lugar de usar un For Eachbucle.

Jon Skeet
fuente
4

Qué pasa:

If Not I = x Then

  ' Do something '

End If

' Move to next item '
timo2oo8
fuente
1

Quiero dejar claro que el siguiente código no es una buena práctica. Puede utilizar GOTO Label:

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
fuente
23
Podrías, pero no lo hagas.
MiseryIndex
Debido al salto, entonces es malo.
Syed Tayyab Ali
4
Si no es una buena práctica, y hay una solución claramente mejor que el idioma admite (Continuar para / Reanudar a continuación), tal vez esta respuesta deba eliminarse voluntariamente.
eniacAvenger
Stackoverflow permite múltiples respuestas con el propósito de explorar la gama de opciones disponibles. Estoy de acuerdo en que esta es una mala opción, pero es una opción. Así que creo que es digno de ser incluido por estar completo.
Jeff
0

Cuando lo probé Continue ForFalló, obtuve un error del compilador. Mientras hacía esto, descubrí 'Reanudar':

For Each I As Item In Items

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

    'Do something

Next

Nota: estoy usando VBA aquí.

Karmendra
fuente
2
Este código ni siquiera funciona en VBA. Resume Nextes para el manejo de errores no estructurados.
Daniel
Debe usar una declaración IF grande para envolver todo el final del ciclo en VBA porque no hay una declaración de continuación. EntoncesIf I <> x Then
HackSlash
0

Sólo el "Continuar para" es un estándar aceptable (el resto conduce al "código espagueti").

Al menos con "continuar para", el programador sabe que el código va directamente al principio del ciclo.

Sin embargo, para los puristas, algo como esto es mejor, ya que es un código puro "no espagueti".

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

Sin embargo, para facilitar la codificación, "Continuar para" está bien. (Aunque es buena idea comentarlo).

Uso de "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
fuente