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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top