Visual Basic .NET Language
Bucle
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