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
foreach
bucle, ¿por qué no utiliza unfor
bucle normal ? Elforeach
bucle estaba destinado a simplificar los usos específicos de losfor
bucles. Parece que tiene una situación en la que la simplicidad de laforeach
ya no es beneficiosa.fuente
IEnumerable.Count
podrí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.foreach
lo 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.for
bucle 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
enumerate
funció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 usarfor
con 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
while
bucle. Los buclesfor
también funcionan, y muchas personas parecen preferirlos, pero solo me gusta usarlosfor
con algo que tenga un número fijo de iteraciones.IEnumerable
s puede generarse en tiempo de ejecución, por lo que, en mi opinión,while
tiene más sentido. Llámelo una directriz informal de codificación, si lo desea.fuente