Cuidadín con los For Each si se modifica el objeto del bucle

Pues eso… aunque esto ya es algo viejo, y se supone que sabido, el otro día no lo recordé y revisando el código de un procedimiento que, a pesar de tratar con muchos registros de una base de datos de SQL Server, veía que tardaba demasiado… y mientras estaba trabajando el método me entretuve en ver la ventana esa de diagnóstico en la que te muestra todo lo que iba haciendo el código (ver la figura 1), y me percaté que repetía fechas…

Ventana de las herramientas de diagnóstico de Visual Studio
Figura 1. La ventana de las Herramientas de diagnósticos de Visual Studio.

Al principio no caí en porqué lo hacía, así que… me puse a revisar el código con las llamadas a las actualizaciones a la base de datos… y al cabo de un rato caí en que estaba usando un bucle For Each y que la variable de ese bucle era un objeto de la clase que se encarga de actualizar los datos (e incluso de crearlos si no existen en la base de datos) y… ¡se me encendió la bombillita esa Light bulb de… idea!

Fue cambiarlo a un bucle normal y tardar muchísimo menos Eye rolling smile, creo que una de las veces me llegó a tardar más de media hora y al hacer el cambio se quedó en 4 minutos o menos.
Y el cambio que hice fue, por ejemplo (en VB), de este:

For Each p In Productos

a este otro:

For i = 0 To Productos.Count - 1
Dim p = Productos(i)

Nota:
El problema de los bucles for each no es solo de Visual Basic, también lo es de C# aunque se escriba de otra forma.

Y lo cuento aquí para que cuando busque «problemas» me de la solución.

Es que, por si no lo sabes, cuando no recuerdo cómo hacer algo en VB o C#, busco en Google, pero le añado al final elguille para que salgan los resultados que tengo publicados y, salvo excepciones, encuentro siempre lo que busco Flirt male, así que… ya sabes… Winking smile

Nos vemos.
Guillermo

Un comentario en “Cuidadín con los For Each si se modifica el objeto del bucle

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *