Me encuentro con esto a menudo durante la programación donde quiero tener un índice de conteo de bucles dentro de un foreach y tengo que crear un número entero, usarlo, incrementar, etc. ¿No sería una buena idea si se introdujera una palabra clave que fuera el bucle cuenta dentro de un foreach? También podría usarse en otros bucles también.
¿Esto va en contra del uso de palabras clave, ya que el compilador no permitiría que esta palabra clave se usara en otro lugar sino en una construcción de bucle?

for ()bucle.Respuestas:
Si necesita un recuento de bucles dentro de un
foreachbucle, ¿por qué no utiliza unforbucle normal ? Elforeachbucle estaba destinado a simplificar los usos específicos de losforbucles. Parece que tiene una situación en la que la simplicidad de laforeachya no es beneficiosa.fuente
IEnumerable.Countpodría ser costoso (o imposible, si es una enumeración única). Debe saber cuál es la fuente subyacente antes de poder hacerlo de forma segura.foreachlo largofor (int i = 0…). Ha escrito un par de páginas, pero puedo resumirlo en dos palabras: optimización del compilador en la iteración. Ok, eso no fueron dos palabras.forbucle proporciona un mejor código legible (y la optimización teórica del compilador a menudo es una optimización prematura).Puedes usar tipos anónimos como este
Esto es similar a la
enumeratefunción de Pythonfuente
Solo estoy agregando la respuesta de Dan Finch aquí, según lo solicitado.
No me des puntos, da puntos a Dan Finch :-)
La solución es escribir el siguiente método de extensión genérico:
Que se usa así:
fuente
Puedo estar equivocado sobre esto, pero siempre pensé que el punto principal del bucle foreach era simplificar la iteración de los días STL de C ++, es decir
compare esto con el uso de .NET de IEnumerable en el foreach
este último es mucho más simple y evita muchas de las viejas trampas. Además, parecen seguir reglas casi idénticas. Por ejemplo, no puede cambiar el contenido IEnumerable mientras está dentro del bucle (lo que tiene mucho más sentido si lo piensa de la manera STL). Sin embargo, el bucle for a menudo tiene un propósito lógico diferente al de la iteración.
fuente
for(IEnumerator e=collection.GetEnumerator;e.MoveNext();) { ... }Si la colección en cuestión es una
IList<T>, simplemente puede usarforcon indexación:Si no, entonces podría usarlo
Select(), tiene una sobrecarga que le da el índice.Si eso tampoco es adecuado, creo que mantener ese índice manualmente es bastante simple, son solo dos líneas de código muy cortas. Crear una palabra clave específicamente para esto sería una exageración.
fuente
foo(++i)ofoo(i++)según qué índice se necesita.Si todo lo que sabe es que la colección es un IEnumerable, pero necesita realizar un seguimiento de cuántos elementos ha procesado hasta ahora (y, por lo tanto, el total cuando haya terminado), puede agregar un par de líneas a un bucle básico:
También puede agregar una variable de índice incremental a un foreach:
Si desea que esto se vea más elegante, puede definir uno o dos métodos de extensión para "ocultar" estos detalles:
fuente
El alcance también funciona si desea mantener el bloque limpio de colisiones con otros nombres ...
fuente
Para esto uso un
whilebucle. Los buclesfortambién funcionan, y muchas personas parecen preferirlos, pero solo me gusta usarlosforcon algo que tenga un número fijo de iteraciones.IEnumerables puede generarse en tiempo de ejecución, por lo que, en mi opinión,whiletiene más sentido. Llámelo una directriz informal de codificación, si lo desea.fuente