Есть ли скрытый счетчик итераций в этом цикле for?

StackOverflow https://stackoverflow.com/questions/413171

  •  03-07-2019
  •  | 
  •  

Вопрос

Если у вас есть цикл 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 %}

... последний пример отлично подходит для списков, разделенных запятыми.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top