C'è un contatore di iterazioni nascosto in questo per il ciclo?
Domanda
Se hai un ciclo for come:
For Each s As String In stringList
..do stuff..
Next
esiste una sorta di iteratore (nascosto) o devo aggiungere un numero intero esterno per tenere il conto:
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
Soluzione
Non esiste un iteratore nascosto, dovresti usare il codice nel tuo secondo esempio o ripristinare un normale ciclo per
.
Altri suggerimenti
Una foreach non richiede un altro contatore. Esegue l'iterazione di ogni stringa nell'elenco (supponendo che stringList nell'esempio sia proprio quello che sembra :)). A meno che non ci sia qualche motivo per cui vuoi smettere di fare qualcosa per ogni stringa nel tuo elenco (cioè elaborare solo le prime 3 stringhe). Sarebbe l'unica ragione per avere un segnalino all'interno del tuo ciclo foreach. Ho appena riletto l'OP. L'altro motivo è sapere quante stringhe hai elaborato.
Spero che questo aiuti! Theresa
Non esiste un iteratore nascosto.
La variabile i
nel tuo esempio è ridondante.
PS: se devi hai bisogno di i
per tenere traccia di qualcosa, lo inizializzerei prima di fare affidamento su di esso.
I foreach loop sono implementati usando un Enumeratore che tiene traccia del conteggio. Se vuoi sapere quanti loop hai passato, devi utilizzare un ciclo for o tenere traccia del conteggio da solo.
Un ciclo for-each terrà traccia dell'enumeratore per te.
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(Mi dispiace per la bastardizzazione di VB e C #, sono un tipo di parentesi graffe - probabilmente è meglio pensarlo come uno pseudo-codice)
L'output del codice sopra riportato
una
due
tre
se si compilasse. :)
Sicuramente non è necessario fornire il proprio numero intero esterno.
Anche così, non esiste un contatore nascosto. C'è un enumeratore nascosto . La differenza è che non tutto ciò che può essere iterato è accessibile per indice. Alcune volte non è possibile ottenere l'elemento successivo in una sequenza fino a quando non si è calcolato l'elemento precedente. Quindi un enumeratore può utilizzare una macchina a stati che tiene traccia della posizione corrente e restituisce l'elemento successivo per ogni iterazione del ciclo, anziché utilizzare un contatore.
Parte della magia di " Per ciascuno " è che non è necessario tenere traccia dell'incremento del loop da soli. È fatto per te. È possibile leggere la documentazione fare riferimento all'interfaccia "IEnumerable" e dire che deve implementare " GetEnumerator () " che è vero. La funzione GetEnumerator () fornisce questa magia.
Penso che sia corretto. Sono sicuro che qualcuno mi correggerà se diversamente.
Da un'elegante vista del codice sarebbe bello se l'enumeratore fosse disponibile con i metodi .First () e .Last ().
Django versione 1.0.2 final ...
Per elencare:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
Prova questo per applicare una 'regola' al primo elemento in un ciclo:
{% if forloop.first %}Starting the loop{% endif %}
Prova questo per escludere l'ultimo elemento:
{% if not forloop.last %}, {% endif %}
... l'ultimo esempio è ottimo per gli elenchi separati da virgole.