Есть ли скрытый счетчик итераций в этом цикле for?
Вопрос
Если у вас есть цикл for, такой как:
For Each s As String In stringList
..do stuff..
Next
есть ли какой-то (скрытый) итератор или мне нужно добавить внешнее целое число для ведения подсчета:
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
Решение
Скрытого итератора нет, вам придется использовать код во втором примере или вернуться к обычному циклу for
.
Другие советы
Для foreach не требуется другой счетчик.Он перебирает каждую строку в вашем списке (предполагая, что StringList в вашем примере - это именно то, на что это похоже :) ).Если только нет какой-либо причины, по которой вы хотите прекратить что-либо делать с каждой строкой в вашем списке (т. Е.обрабатывайте только первые 3 строки).Это было бы единственной причиной иметь счетчик внутри вашего цикла foreach.Я только что перечитал статью.Другая причина заключается в том, чтобы знать, сколько строк вы обработали.
Надеюсь, это поможет!Тереза
Скрытого итератора нет.
Переменная i
в вашем примере является избыточной.
PS: если вам нужно нужен i
для отслеживания чего-либо, я инициализирую его, прежде чем положиться на него.
Циклы foreach реализованы с использованием Enumerator, который отслеживает количество. Если вы хотите узнать, сколько циклов вы прошли, вам нужно использовать цикл for или отслеживать счет самостоятельно. Р>
Цикл for-each будет отслеживать перечислитель для вас.
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(Извините за ублюдочность VB и C #, я любитель фигурных скобок - вероятно, лучше всего думать об этом как о псевдокоде)
Приведенный выше код выводил бы
один
два
три
если бы это скомпилировалось.:)
Вам определенно не нужно указывать собственное внешнее целое число. Р>
Несмотря на это, скрытого счетчика нет. Существует скрытый перечислитель . Разница в том, что не все, что может быть повторено, доступно по индексу. Иногда вы не можете получить следующий элемент в последовательности, пока не вычислите предыдущий элемент. Поэтому перечислитель может использовать конечный автомат, который отслеживает вашу текущую позицию и возвращает следующий элемент для каждой итерации цикла, а не счетчик.
Часть магии "Для каждого" в том, что вам не нужно самостоятельно отслеживать приращение цикла. Это сделано для тебя. Вы можете прочитать документацию со ссылкой на интерфейс «IEnumerable». и скажем, что он должен реализовывать " GetEnumerator () " что является правдой. Функция GetEnumerator () предоставляет эту магию.
Я думаю, что это правильно. Я уверен, что кто-то исправит меня, если иначе.
Из элегантного представления кода было бы неплохо, если бы перечислитель был доступен с методами .First () и .Last ().
Django версия 1.0.2 финальная ...
Для перечисления:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
Попробуйте применить «правило» к первому элементу в цикле:
{% if forloop.first %}Starting the loop{% endif %}
Попробуйте исключить последний элемент.
{% if not forloop.last %}, {% endif %}
... последний пример отлично подходит для списков, разделенных запятыми.