Buscar..


Para ... siguiente

For ... El Next bucle se usa para repetir la misma acción un número finito de veces. Las declaraciones dentro del siguiente bucle se ejecutarán 11 veces. La primera vez, i tendrá el valor 0, la segunda vez que tendrá el valor 1, la última vez que tendrá el valor 10.

For i As Integer = 0 To 10
    'Execute the action
    Console.Writeline(i.ToString)
Next

Se puede utilizar cualquier expresión entera para parametrizar el bucle. Se permite, pero no se requiere, que la variable de control (en este caso i ) también se indique después de la Next . Se permite que la variable de control se declare por adelantado, en lugar de dentro de la instrucción For .

Dim StartIndex As Integer = 3
Dim EndIndex As Integer = 7
Dim i As Integer

For i = StartIndex To EndIndex - 1
    'Execute the action
    Console.Writeline(i.ToString)
Next i

La posibilidad de definir los enteros de Inicio y Fin permite crear bucles que hacen referencia directamente a otros objetos, como:

For i = 0 to DataGridView1.Rows.Count - 1
    Console.Writeline(DataGridView1.Rows(i).Cells(0).Value.ToString)
Next

Esto luego pasaría por cada fila en DataGridView1 y realizaría la acción de escribir el valor de la Columna 1 en la Consola. (El -1 se debe a que la primera fila de las filas contadas sería 1, no 0)

También es posible definir cómo debe incrementarse la variable de control.

For i As Integer = 1 To 10 Step 2
    Console.Writeline(i.ToString)
Next 

Esto produce:

1 3 5 7 9

También es posible disminuir la variable de control (cuenta atrás).

For i As Integer = 10 To 1 Step -1
    Console.Writeline(i.ToString)
Next

Esto produce:

10 9 8 7 6 5 4 3 2 1

No debe intentar usar (leer o actualizar) la variable de control fuera del bucle.

Para cada ... Siguiente bucle para recorrer la colección de elementos

Puede usar un bucle For Each...Next para iterar a través de cualquier tipo de IEnumerable . Esto incluye matrices, listas y cualquier otra cosa que pueda ser de tipo IEnumerable o que devuelva un IEnumerable.

Un ejemplo de bucle a través de la propiedad Rows de un DataTable se vería así:

For Each row As DataRow In DataTable1.Rows
    'Each time this loops, row will be the next item out of Rows
    'Here we print the first column's value from the row variable.
    Debug.Print(Row.Item(0))
Next 

Es importante tener en cuenta que la colección no debe modificarse en un bucle For Each . Si lo hace, provocará una System.InvalidOperationException con el mensaje:

La colección fue modificada; La operación de enumeración no puede ejecutarse.

Mientras bucle para iterar mientras alguna condición es verdadera

Un bucle While comienza evaluando una condición. Si es cierto, se ejecuta el cuerpo del bucle. Después de que se ejecuta el cuerpo del bucle, la condición While se evalúa nuevamente para determinar si se debe volver a ejecutar el cuerpo.

Dim iteration As Integer = 1
While iteration <= 10
  Console.Writeline(iteration.ToString() & " ")

  iteration += 1
End While

Esto produce:

1 2 3 4 5 6 7 8 9 10

Advertencia: un bucle While puede llevar a un bucle infinito . Considere qué pasaría si se eliminara la línea de código que incrementa la iteration . En tal caso, la condición nunca sería verdadera y el bucle continuaría indefinidamente.

Hacer ... bucle

Use Do...Loop para repetir un bloque de declaraciones While o Until una condición sea verdadera, verificando la condición al principio o al final del ciclo.

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
Loop While x < 10

o

Dim x As Integer = 0
Do While x < 10
    Console.Write(x & " ")
    x += 1
Loop

0 1 2 3 4 5 6 7 8 9

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
Loop Until x = 10

o

Dim x As Integer = 0
Do Until x = 10
    Console.Write(x & " ")
    x += 1
Loop

0 1 2 3 4 5 6 7 8 9

Continue Do se puede usar para saltar a la siguiente iteración del bucle:

Dim x As Integer = 0
Do While x < 10
    x += 1
    If x Mod 2 = 0 Then
        Continue Do
    End If
    Console.Write(x & " ")
Loop

1 3 5 7 9

Puede terminar el ciclo con Exit Do : tenga en cuenta que en este ejemplo, la falta de cualquier condición causaría un ciclo infinito:

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
    If x = 10 Then
        Exit Do
    End If
Loop

0 1 2 3 4 5 6 7 8 9

Cortocircuito

Cualquier bucle se puede terminar o continuar antes en cualquier momento mediante el uso de las instrucciones Exit o Continue .

Saliendo

Puedes detener cualquier bucle saliendo antes. Para hacer esto, puede usar la palabra clave Exit junto con el nombre del bucle.

Lazo Declaración de salida
por Exit For
Para cada Exit For
Hacer mientras Exit Do
Mientras Exit While

Salir temprano de un bucle es una excelente manera de mejorar el rendimiento, solo haciendo un bucle el número necesario de veces para satisfacer las necesidades de la aplicación. A continuación se muestra un ejemplo donde el bucle saldrá una vez que encuentre el número 2 .

Dim Numbers As Integer() = {1,2,3,4,5}
Dim SoughtValue As Integer = 2
Dim SoughtIndex
For Each i In Numbers
    If i = 2 Then 
        SoughtIndex = i
        Exit For
    End If
Next
Debug.Print(SoughtIndex)

Continuo

Además de salir temprano, también puede decidir que necesita pasar a la siguiente iteración de bucle. Esto se hace fácilmente usando la instrucción Continue . Al igual que Exit , se procede con el nombre del bucle.

Lazo Continuar declaración
por Continue For
Para cada Continue For
Hacer mientras Continue Do
Mientras Continue While

Este es un ejemplo de cómo evitar que se agreguen números pares a la suma.

Dim Numbers As Integer() = {1,2,3,4,5}
Dim SumOdd As Integer = 0
For Each i In Numbers
    If Numbers(i) \ 2 = 0 Then Continue For
    SumOdd += Numbers(i)
Next

Consejos de uso

Hay dos técnicas alternativas que se pueden usar en lugar de usar Exit o Continue .

Puede declarar una nueva variable booleana, inicializándola a un valor y configurándola condicionalmente al otro valor dentro del bucle; luego utiliza una declaración condicional (por ejemplo, If ) basada en esa variable para evitar la ejecución de las declaraciones dentro del bucle en las iteraciones posteriores.

Dim Found As Boolean = False
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
    If Not Found AndAlso A(i) = SoughtValue Then
        FoundIndex = i
        Found = True
    End If
Next

Una de las objeciones a esta técnica es que puede ser ineficiente. Por ejemplo, si en el ejemplo anterior N es 1000000 y el primer elemento de la matriz A es igual a SoughtValue , el bucle repetirá 999999 veces más sin hacer nada útil. Sin embargo, esta técnica puede tener la ventaja de una mayor claridad en algunos casos.

Puede utilizar la instrucción GoTo para saltar fuera del bucle. Tenga en cuenta que no puede utilizar GoTo para saltar a un bucle.

    Dim FoundIndex As Integer
    For i As Integer = 0 To N - 1
        If A(i) = SoughtValue Then
            FoundIndex = i
            GoTo Found
        End If
    Next
    Debug.Print("Not found")
Found:
    Debug.Print(FoundIndex)

Esta técnica a veces puede ser la mejor forma de saltar fuera del bucle y evitar una o más declaraciones que se ejecutan justo después del final natural del bucle.

Debe considerar todas las alternativas y utilizar la que mejor se ajuste a sus requisitos, considerando la eficiencia, la velocidad de escritura del código y la legibilidad (por lo tanto, la capacidad de mantenimiento).

No se desanime con GoTo en aquellas ocasiones en que sea la mejor alternativa.

Bucle anidado

A nested loop is a loop within a loop, an inner loop within the body of an outer one. How this works is that the first pass of the outer loop triggers the inner loop, which executes to completion. Then the second pass of the outer loop triggers the inner loop again. This repeats until the outer loop finishes. a break within either the inner or outer loop would interrupt this process.

La estructura de un bucle anidado para el siguiente es:

For counter1=startNumber to endNumber (Step increment)

    For counter2=startNumber to endNumber (Step increment)

        One or more VB statements

    Next counter2

Next  counter1

Ejemplo:

    For  firstCounter = 1 to 5

      Print “First Loop of ” + firstCounter

    For   secondCounter= 1 to 4

      Print “Second Loop of ” + secondCounter

    Next secondCounter

  Next firstCounter


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow