Existe um contador de iteração escondido neste loop for?
Pergunta
Se você tem um loop, tais como:
For Each s As String In stringList
..do stuff..
Next
Existe algum tipo de (oculto) iterator ou tenho de acrescentar um inteiro externo para manter a contagem:
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
Solução
Não há escondido iterador, você teria que usar o código em seu segundo exemplo ou para trás revert a um loop for
regular.
Outras dicas
A foreach não requer outro balcão. Ele itera através de cada corda em sua lista (assumindo StringList no seu exemplo é apenas o que parece :)). A menos que haja algum motivo você quer parar de fazer algo para cada corda em sua lista (isto é, apenas processar os primeiros 3 cordas). Essa seria a única razão para ter um contador dentro de seu loop foreach. Eu só reler o OP. A outra razão é saber quantas cordas você ter processado.
Espero que isso ajude! Theresa
Não há escondido iterador.
O i
variável no seu exemplo é redundante.
PS:. Se você do necessidade i
manter o controle de alguma coisa, eu inicialize-o antes de eu contar com ele
foreach loops são implementados usando um enumerador que mantém o controle da contagem. Se você quer saber quantas voltas você já passou por você precisa usar um loop for ou acompanhar a contagem de si mesmo.
A para-cada loop irá acompanhar o enumerador para você.
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(Desculpe o abastardamento da VB e C #, eu sou um chaves tipo de cara - provavelmente melhor pensar nisso como pseudo-código)
O código acima saída seria
um
dois
três
se ele iria compilar. :)
Você definitivamente não precisa fornecer o seu próprio número inteiro externo.
Mesmo assim, não há escondido counter . Há um escondido recenseador . A diferença é que nem tudo o que pode ser iterado é acessível por índice. Algumas vezes você não pode obter o próximo item em uma seqüência até que você tenha calculado o item anterior. Então um enumerador pode usar uma máquina de estados que controla a sua posição atual e retorna o próximo item para cada iteração do loop, em vez de usar um contador.
Parte da magia de "For Each" é que você não precisa controlar o loop incrementor si mesmo. Ele é feito para você. Você pode ler a documentação referem-se a interface "IEnumerable" e dizer que deve implementar "GetEnumerator ()" o que é verdade. A função GetEnumerator () fornece essa magia.
Eu acho que está correto. Tenho certeza de que alguém vai me corrija se de outra forma.
A partir de uma visão de código elegante seria bom se o enumerador estava disponível com .primeira () e .last () métodos.
Versão Django 1.0.2 final, ...
Para enumerar:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
Tente isto para aplicar uma 'regra' para o primeiro item em um loop:
{% if forloop.first %}Starting the loop{% endif %}
Tente isto para excluir o último item:
{% if not forloop.last %}, {% endif %}
... o último exemplo é ótimo para separados por vírgula listas.