¿Hay un contador de iteraciones oculto en este bucle for?
Pregunta
Si tiene un bucle for como:
For Each s As String In stringList
..do stuff..
Next
¿hay algún tipo de iterador (oculto) o debo agregar un número entero externo para mantener el conteo?
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
Solución
No hay un iterador oculto, tendría que usar el código en su segundo ejemplo o volver a un bucle for
normal.
Otros consejos
Un foreach no requiere otro contador. Se itera a través de cada cadena en su lista (suponiendo que stringList en su ejemplo es exactamente lo que parece :)). A menos que haya alguna razón por la que desee dejar de hacer algo con cada cadena de su lista (es decir, solo procese las primeras 3 cadenas). Esa sería la única razón para tener un contador dentro de su bucle foreach. Acabo de releer el OP. La otra razón es saber cuántas cadenas ha procesado.
¡Espero que esto ayude! Teresa
No hay iterador oculto.
La variable i
en su ejemplo es redundante.
PD: si do necesita i
para realizar un seguimiento de algo, lo inicializaría antes de confiar en él.
los bucles foreach se implementan utilizando un enumerador que realiza un seguimiento del recuento. Si desea saber cuántos bucles ha pasado, debe usar un bucle for o realizar un seguimiento del conteo usted mismo.
Un ciclo for-each hará un seguimiento del enumerador por usted.
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(Perdón por la bastardisation de VB y C #, soy un tipo de persona con corchetes, probablemente sea mejor pensarlo como pseudocódigo)
El código anterior generaría
uno
dos
tres
si se compilara. :)
Definitivamente no necesita proporcionar su propio número entero externo.
Aun así, no hay un contador oculto. Hay un enumerador oculto. La diferencia es que no todo lo que se puede iterar es accesible por índice. Algunas veces no puede obtener el siguiente elemento en una secuencia hasta que haya calculado el elemento anterior. Por lo tanto, un enumerador puede usar una máquina de estado que rastrea su posición actual y devuelve el siguiente elemento para cada iteración del bucle, en lugar de usar un contador.
Parte de la magia de "Para cada uno" es que usted no necesita rastrear el incremento del ciclo usted mismo. Ya está hecho para ti. Puede leer la documentación, consulte la interfaz '' IEnumerable '' y decir que debe implementar "GetEnumerator ()" cual es verdad. La función GetEnumerator () proporciona esta magia.
Creo que eso es correcto. Estoy seguro de que alguien me corregirá si no.
Desde una vista de código elegante, sería bueno si el enumerador estuviera disponible con los métodos .First () y .Last ().
Django versión 1.0.2 final ...
Para enumerar:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
Pruebe esto para aplicar una 'regla' al primer elemento en un bucle:
{% if forloop.first %}Starting the loop{% endif %}
Pruebe esto para excluir el último elemento:
{% if not forloop.last %}, {% endif %}
... el último ejemplo es excelente para listas separadas por comas.