Escenario
Imagina este escenario:
para y para el bucle son buenas opciones para resolver este problema.
para
Sintaxis
Por convención, aprendemos primero la sintaxis de la declaración:
1234for(initializer; condition; update_expression){ code_block;}
csharp
La sentencia for está compuesta por inicializador, condición, expresión_actualización, código_bloque:
- code_block representa la lógica ejecutada en el bucle. Podría incluir múltiples declaraciones, incluso otro bloque de bucle.
- El inicializador es la lógica que quieres ejecutar antes de entrar en el bucle. Normalmente, es para la inicialización de las variables del bucle.
- es una expresión booleana. Decide si debe continuar el bucle o salir del bucle.
- update_expression define expresiones de actualización en cada bucle. Se ejecuta después de code_block. Al igual que el inicializador, es para la actualización de las variables del bucle como es habitual.
Diagrama de flujo
Por favor, echa un vistazo al diagrama de flujo del bucle. Muestra el control del flujo de forma intuitiva.
A través del diagrama de flujo de arriba, podemos averiguar el proceso de ejecución de for loop:
- Antes del bucle, el inicializador se ejecuta exactamente una vez. Es una buena oportunidad para declarar e inicializar las variables del bucle.
- Compruebe si cumple la condición. Si se satisface, ejecute el código_bloque lógico de bucle. De lo contrario, termine el bucle.
- Después de code_block, ejecuta update_expression. Actualiza la variable del bucle aquí para la siguiente verificación de la condición.
- Vuelve al paso dos para juzgar la condición de nuevo. Repita este proceso hasta que la condición==Falso.
Práctica
Ya que hemos aprendido el mecanismo de para el bucle, es hora de resolver un problema de ejemplo:
12345678910string[] tasks ={"bedroom", "kitchen", "toilet"};// la variable de bucle i presenta el índice de tareas arrayfor(int i =0; i < tasks.Length;++i){ Console.WriteLine("mission complete: clean {0}", tasks[i]);}/*output:mission complete: clean bedroommission complete: clean kitchenmission complete: clean toilet */
csharp
Uso avanzado
Cada una de estas cuatro secciones – inicializador, condición, expresión_actualizada, y bloque_de_código – podrían ser opcionales. Además, podrían incluir múltiples declaraciones:
- code_block utiliza ; para separar las declaraciones.
- inicializar y actualizar_expresiones, para separar las declaraciones.
- …para conectar las expresiones booleanas.
Practiquemos las múltiples declaraciones en todas las secciones de este complejo ejemplo:
123456789101112// x empieza de 0 y suma 1 cada vez; y empieza de 12 y resta 2 cada vez// iteración cuando x no es mayor que y y la producción es menor que 18for(int x =0, y =12; x <= y && x * y <18;++x, y -=2){/// calcula la diferencia entre y y x, y luego imprime la diferencia de y - x; Consola. WriteLine("x={0}, y={1}, diferencia={2}", x, y, diferencia);}/* salida_x=0, y=12, diferencia=12x=1, y=10, diferencia=9x=2, y=8, diferencia=6 */
csharp
foreach
Sintaxis
Para el escenario sobre el acceso a los elementos de una colección, foreach es la mejor solución.
La sintaxis de la frente:
1234foreach(elemento en IEnumerable){ code_block;}
csharp
- representa el elemento actual en una colección.
- IEmutable representa una estructura de datos de tipo colección que implementa la interfaz IEnumerable. Hablaremos de esto más tarde.
- code_block es similar a otros. Representa la lógica ejecutada en el bucle.
Diagrama de flujo
El diagrama de flujo del bucle de proa visualiza el proceso de control de flujo:
- Comprueba si a IEnumberable le queda algún elemento.
- Si lo ha hecho, asigne al elemento y al proceso en code_block. De lo contrario, salga del bucle.
- Repita este proceso hasta que IEnumberable se agote.
Práctica
Para el escenario anterior, anteponga el elemento a las tareas de la matriz de cuerdas:
123456string[] tasks ={"dormitorio", "cocina", "baño"};// foreach the element in string array tasksforeach(string task in tasks){ Console.WriteLine("misión completa: limpiar {0}", tarea);}
csharp
Ámbito de aplicación
foreach apoya la iteración de un elemento en todo tipo de IEnumerable. Entonces, ¿qué es el IEnumerable?
Una explicación fácilmente comprensible es que IEnumberable es una estructura de datos de tipo colección, como int[], List, Dictionary, o DataRow.
Una ilustración más formal es que foreach cubre el tipo que implementa la interfaz IEnumberable o
IEnumerable. Este tipo devuelve un elemento por GetEnumerator(); un elemento debe implementar dos características esenciales para soportar foreach:
- Implementar la propiedad de la corriente para ayudar a forach a acceder al elemento de la corriente.
- Implementar bool MoveNext() para comprobar si podemos obtener el siguiente elemento (devolver falso al llegar al final).
No vamos a expandirnos aquí. He adjuntado documentos oficiales en caso de que quieras profundizar en ello:
para vs foreach
- Similar a while vs do while, puedes considerar foreach como la extensión de for. Se usa típicamente cuando te concentras en procesar un elemento de una colección en un bucle.
- En el caso de la iteración de elementos, se trata del índice de colección y se accede a un elemento por el índice de forma indirecta. Así que, si queremos acceder a un elemento de una colección en orden, y no nos importa el índice, entonces la mejor práctica es.
- para el bucle se utiliza ampliamente sin ninguna restricción, pero foreach tiene algunas limitaciones:No puede modificar la colección cuando itera (se permite modificar el miembro del elemento).no hace un seguimiento del índice, por lo que no soporta operaciones de índice en un bucle.el orden de iteración sólo puede ser hacia adelante. No admite operaciones de desplazamiento en orden inverso o aleatorio.No se puede añadir una condición extra a los elementos de filtro.