Domina cómo recorrer arreglos con confianza: de while y do-while a for y foreach. Verás cómo evitar fallos por índices, escribir código más legible y apoyarte en Visual Studio Code para renombrar métodos con F2 y formatear con Alt+Shift+F para mantener todo claro y coherente.
¿Qué cambia entre while y do-while al recorrer arreglos?
Ambos producen el mismo resultado si la lógica del contador es correcta, pero se comportan distinto: do-while garantiza al menos una ejecución. El punto crítico es dónde incrementas el contador. Colocarlo antes o después de la comparación altera qué elemento se imprime primero y puede romper la lógica.
// whileint contador =0;while(contador < arregloCursos.Length){// imprimir arregloCursos[contador]. contador++;}// do-whilecontador =0;do{// imprimir arregloCursos[contador]. contador++;}while(contador < arregloCursos.Length);// Variante riesgosa: cambia la lógica del flujocontador =0;while(++contador < arregloCursos.Length){// aquí se salta la posición 0.}
¿Cómo afecta el incremento del contador?
Incrementar después imprime desde la posición cero de forma natural.
Incrementar antes puede saltar elementos e introducir errores.
Usar contador++ en distintos lugares cambia la semántica del bucle.
Mantén consistencia para preservar la intención del recorrido.
¿Cómo ayuda el editor a mantener coherencia?
Renombrar métodos con F2 o con la opción Rename Symbol actualiza todas las referencias.
Formatear con Alt+Shift+F alinea el código y reduce confusiones visuales.
¿Cómo se estructura un for seguro y legible?
El for condensa inicialización, condición e incremento en una sola línea. Esto mejora la lectura y deja clara la secuencia: crear índice, validar condición, ejecutar tarea e incrementar. Sin embargo, un pequeño cambio en la condición puede causar acceso fuera de rango.
for(int i =0; i < arregloCursos.Length; i++){// imprimir arregloCursos[i].}// Error común: acceso fuera de rangofor(int i =0; i <= arregloCursos.Length; i++){// podría intentar acceder a arregloCursos[Length], que no existe.}// Flexibilidad: incrementos personalizadosfor(int i =0; i < arregloCursos.Length; i +=2){// recorrer de dos en dos si así se requiere.}
¿Qué buenas prácticas evitan errores con for?
Usar < en lugar de <= al comparar con Length.
Preferir nombres cortos como i para contadores por legibilidad.
Mantener la lógica de incremento simple (i++) salvo que tengas un motivo claro para cambiarla.
Probar la salida para validar que el recorrido imprime lo esperado.
¿Por qué foreach reduce errores al recorrer arreglos?
Con foreach no gestionas índices ni longitudes. Iteras directamente cada elemento, lo que hace el código más breve, claro y resistente a errores por límites. Además, se menciona un impacto notable a nivel de memoria, aunque el objetivo principal aquí es claridad y seguridad.
foreach(var curso in arregloCursos){// imprimir curso.}
¿Qué ventajas ofrece foreach en este escenario?
Elimina riesgos de <= o de desbordes por índice.
Mejora la legibilidad: expresa la intención “para cada curso”.
Reduce el esfuerzo cognitivo al no manejar i ni contador.
Es ideal cuando no necesitas la posición del elemento.
¿Tú con cuál bucle te quedas para recorrer arreglos y por qué? Comparte tu experiencia y cuéntanos qué prácticas te han ayudado a evitar errores de índice.
El método Console.WriteLine() solo llama a la funcion .ToString(), ya que si no la encuentra en el objeto que recibe por parámetro, ejecuta.ToString()de la class object.
Podes cambiar el codigo a Console.WriteLine(arregloCurso[contador]); que va a funcionar igualmente 😉
Buen aporte, toString se ve redundante.
El bucle ForEach fue principalmente hecho para recorrer arrays
Valla dato perturbador
al medir el tiempo de ejecuccion es mucha la diferencia.
Como mediste el tiempo de ejecucion? Cual es cual?
Hola Karen, mi respuesta llega un poco tarde, recién estoy llevando este curso. Para definir el tiempo de duración de una ejecución, debes definir 2 puntos donde será medido de inicio y fin.
Para esto se instancia un objeto de la clase StopWatch, este objeto requiere el uso del namespace System.diagnostics. Lo colocas con using System.diagnostics, luego los métodos en la instancia de StopWatch son:
StopWatch tiempo1 =new();tiempo1.Start();//Define inicio de la marca de tiempotiempo1.Stop();//Define fin de la marca de tiempotiempo1.ElapsedMilliseconds;//Devuelve la resta entre Stop y Start en milisegundos.
++Los separadores también se pueden hacer de la siguiente forma:++
Si lo dejan el Do while con (contador++ <arregloCursos.Legth)
privatestaticvoidImprimirCursosDoWhile(Curso[] arregloCursos){ int contador =0;do{Console.WriteLine($"Nombre {arregloCursos[contador].Nombre}, Id {arregloCursos[contador].UniqueId}");}while(contador++< arregloCursos.Length);}
Al final le indicara que no encontró la última posición y que se salió del arreglo, debido a que cuando contador=2 es < que arregloCursos.Legth y vuelve a hacer una vuelta extra pero ahora es contador=3; debido a que le sumo 1 después de hacer la comparación, y el arreglo ya no tiene posición 3 por eso hay que tener cuidado de donde se coloca el contador++ como bien mencionó el profesor.
En mi opinion, tratar de hacer el codigo mas "simple" o "legible", a veces lo complica mas, yo pienso que el codigo mas simple o legible es el que puede leer una persona que no sea necesariamente experto en el lenguaje.
El código se debe hacer de tal forma que sea fácil de leer, siempre va a ser necesario regresar a código antiguo y es más fácil hacer el trabajo si este es fácil de entender.
**Dato interesante: ** En el For Each Juan Carlos decidió usar VAR como el tipo de cada uno de los elementos en el arreglo. Esto es posible porque VAR es mas general y recibe mas tipos de datos/objetos.
foreach(var curso in cursoArreglo){Console.WriteLine($"{curso.nombre}, {curso.id}");}
Pero también es posible usar el tipo de la variable que ya sabes que se encuentra dentro del arreglo, en este caso el tipo Curso. Quedando de esta manera:
foreach(Curso curso in cursoArreglo){Console.WriteLine($"{curso.nombre}, {curso.id");}
Importante decir que con do...while, lo que esta dentro del do se ejecuta al menos una vez SIEMPRE, sin importar la condicion de while.
Cuál es la diferencia en memoria entre For vs Foreach?
@juandc, muchas gracias. Una respuesta muy clásica, depende de lo que se requiera hacer.
En palabras cortas: foreach, para recorrer alguna lista de objetos si desconoces cuánto mide.
for: para todo lo demás
En el DoWhile si escribimos incrementando el contador dentro del While pero haciendo el incremento después de que se ejecute la pregunta el código arroja un error porque el contador va a valer 3 y al querer ejecutar el array de máximo 2 va a fallar.
privatestaticvoidImprimirCursosWhile(Curso[] arregloCursos){ int contador =0;do{Console.WriteLine($"Nombre {arregloCursos[contador].Nombre}, Id {arregloCursos[contador].UniqueId}");//contador ++;}while(contador++< arregloCursos.Length);
Si que me está agradando la manera de entender las diferencias y en que casos podemos utilizar un arreglo.
Rename Symbol F2 para cambiar los demas lugares donde se llama un metodo.
**Prefijo: ** ++contador (primero se asigna el valor de incremento para posteriormente realizar la operación).
**Posfijo: ** contador ++ (se realiza la operación y luego se suma para almacenarse el valor).
Hola. El profesor menciona que el foreach a nivel de memoria cambia bastante. ¿Alguien sabe los detalles técnicos de esta diferencia que menciona el profesor?
Además de recorrer un arreglo con la sentencia while podemos encontrar:
La sentencia do while donde a diferencia de while se va a ejecutar primero el código y luego va a verificar si la condición es válida.
La sentencia for.
La sentencia foreach.
Para que en la impresión podemos identificar cada uno de los diferentes recorridos:
System.Console.WriteLine("============ Normal");Console.WriteLine(escuela);System.Console.WriteLine("============ While");imprimirCursosWhile(arregloCursos);System.Console.WriteLine("============ Do While");imprimirCursosDoWhile(arregloCursos);System.Console.WriteLine("============ For");imprimirCursosFor(arregloCursos);System.Console.WriteLine("============ For Each");imprimirCursosForEach(arregloCursos);
Es interesante comentar que a nivel de programación si las sentencias de comparación o de bucles solo tiene una instrucción se puede prescindir de los corchetes, así:
foreach(Curso c in arregloCursos)Console.WriteLine(c.Nombre+","+ c.UniqueId);
Si, pero no es una buena practica amigo, menos si alguien está aprendiendo, luego en la "vida real" se utilizan analizadores de código estático como SonarQube o StyleCop y eso se transforma aun error en el código por representar falta de legibilidad y mantenibilidad.
foreach(Curso curso in array){Console.WriteLine($"\n{curso}");}
Tambien es una respuesta valida.
Normalmente hay muchas formas de escribir una instrucción , solo debes buscar legibilidad y que funcione correctamente