El bucle For Each en Visual Basic está diseñado para recorrer secuencialmente todos los elementos de una colección o un array. Su uso simplifica el trabajo con objetos enumerables (Collection, Array, listas, etc.), sin requerir el acceso explícito a los índices.
Sintaxis:
For Each element As DataType In collection ' Acciones con element Next
Diferencias con otros bucles:
For — requiere especificar un contador y un rango, es efectivo cuando es necesario acceder a los elementos por índice.While — se ejecuta mientras la condición sea verdadera, adecuado para cantidades impredecibles de iteraciones.For Each — itera sobre todos los elementos sin acceso a índices, adecuado para colecciones modernas.Limitaciones y características de For Each:
Ejemplo:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
Intentar modificar la colección dentro del bucle puede provocar un error:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' ¡Excepción! End If Next
¿Se pueden modificar los elementos de la colección por valor usando For Each, si los elementos son estructuras?
No, si los elementos de la colección son estructuras (tipos de valor), la variable de iteración en For Each contiene una copia del valor. Cualquier modificación de la variable no afectará al verdadero elemento de la colección. Por ejemplo:
Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' No modifica points(0).X Next
Historia
En el proyecto se utilizó For Each para modificar los campos de las estructuras de los empleados. La iteración no modificó los datos originales, porque el objeto de iteración era una copia, no el propio elemento de la colección. Debido a esto, la actualización de salarios no funcionó.
Historia
Durante la iteración de la lista en For Each se eliminaban elementos dentro de la condición, como resultado, la aplicación arrojaba InvalidOperationException y terminaba abruptamente.
Historia
Recorrer una colección a través de For Each sin tener en cuenta su mutabilidad llevó a un bucle infinito, cuando una fuente de datos externa llenaba esta colección al mismo tiempo que se leía, provocando errores lógicos en los cálculos.