Y a-t-il un compteur d'itération caché dans cette boucle?
Question
Si vous avez une boucle for telle que:
For Each s As String In stringList
..do stuff..
Next
Existe-t-il une sorte d'itérateur (masqué) ou dois-je ajouter un entier externe pour que le nombre de comptes soit maintenu:
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
La solution
Il n'y a pas d'itérateur masqué, vous devez utiliser le code de votre deuxième exemple ou revenir à une boucle classique pour
.
Autres conseils
Un foreach n’a pas besoin d’un autre compteur. Il effectue une itération sur chaque chaîne de votre liste (en supposant que chaîneListe dans votre exemple est exactement ce que cela ressemble :)). Sauf si vous avez une raison quelconque de ne pas vouloir modifier chaque chaîne de votre liste (par exemple, ne traitez que les 3 premières chaînes). Ce serait la seule raison d'avoir un compteur dans votre boucle foreach. Je viens de relire l'OP. L'autre raison est de savoir combien de chaînes vous avez traitées.
J'espère que ça aide! Thérèse
Il n'y a pas d'itérateur caché.
La variable i
de votre exemple est redondante.
PS: Si vous avez besoin de i
pour garder trace de quelque chose, je l'initialisais avant de m'y fier.
Les boucles foreach sont mises en oeuvre à l'aide d'un énumérateur qui enregistre le nombre. Si vous voulez savoir combien de boucles vous avez parcourues, vous devez utiliser une boucle for ou garder une trace du nombre vous-même.
Une boucle for-each gardera une trace de l'énumérateur pour vous.
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(Désolé pour la bastardisation de VB et C #, je suis un gars du genre accolés - il est probablement préférable de le considérer comme un pseudo-code)
Le code ci-dessus serait généré
un
deux
trois
si cela compilerait. :)
Vous n'avez certainement pas besoin de fournir votre propre entier externe.
Même dans ce cas, il n'y a pas de compteur caché . Il existe un énumérateur caché. La différence est que tout ce qui peut être itéré n'est pas accessible par index. Parfois, vous ne pouvez pas obtenir l'élément suivant d'une séquence tant que vous n'avez pas calculé l'élément précédent. Ainsi, un énumérateur peut utiliser une machine à états qui suit votre position actuelle et renvoie l'élément suivant pour chaque itération de la boucle, plutôt que d'utiliser un compteur.
Une partie de la magie de " For Each " c'est que vous n'avez pas besoin de suivre l'incrémenteur de boucle vous-même. C'est fait pour vous. Vous pouvez lire la documentation en vous reportant à l’interface " IEnumerable " et dire qu'il doit implémenter & Get; Numérateur () " ce qui est vrai. La fonction GetEnumerator () fournit cette magie.
Je pense que c'est correct. Je suis sûr que quelqu'un me corrigera sinon.
Dans une vue de code élégante, il serait bien que l'énumérateur soit disponible avec les méthodes .First () et .Last ().
Django version 1.0.2 finale ...
Pour énumérer:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
Essayez d'appliquer une "règle" au premier élément d'une boucle:
{% if forloop.first %}Starting the loop{% endif %}
Essayez ceci pour exclure le dernier élément:
{% if not forloop.last %}, {% endif %}
... le dernier exemple convient parfaitement aux listes séparées par des virgules.