Я часто сталкиваюсь с этим во время программирования, когда я хочу иметь индекс числа циклов внутри foreach и должен создавать целое число, использовать его, увеличивать и т. Д. Не было бы хорошей идеей, если было введено ключевое слово, которое было количество циклов внутри foreach? Это также может быть использовано в других циклах.
Идет ли это против использования ключевых слов, поскольку компилятор не позволяет использовать это ключевое слово где-либо, кроме как в циклической конструкции?
for ()
цикл.Ответы:
Если вам нужно количество циклов внутри
foreach
цикла, почему бы вам просто не использовать обычныйfor
цикл.foreach
Петля была предназначена , чтобы сделать определенные виды использованияfor
петель более простых. Похоже, у вас есть ситуация, когда простотаforeach
больше не является выгодной.источник
IEnumerable.Count
может быть дорогим (или невозможным, если это только один раз). Вы должны знать, что является основным источником, прежде чем вы сможете безопасно это сделать.foreach
болееfor (int i = 0…)
. Он написал пару страниц, но я могу подвести итог в двух словах - оптимизация компилятора на итерации. Хорошо, это не два слова.for
цикл дает более читаемый код (а теоретическая оптимизация компилятора часто является преждевременной оптимизацией).Вы можете использовать анонимные типы, как это
Это похоже на
enumerate
функцию Pythonисточник
Я просто добавляю ответ Дана Финча здесь, как и просил.
Не дай мне очков, дай очки Дану Финчу :-)
Решением является написание следующего общего метода расширения:
Который используется так:
источник
Я могу ошибаться по этому поводу, но я всегда думал, что основной целью цикла foreach было упрощение итерации со дней STL в C ++, т.е.
сравните это с использованием .NET IEnumerable в foreach
последнее намного проще и позволяет избежать многих старых ошибок. Кроме того, они, кажется, следуют почти одинаковым правилам. Например, вы не можете изменить содержимое IEnumerable внутри цикла (что имеет гораздо больше смысла, если вы думаете об этом в стиле STL). Однако цикл for часто имеет другое логическое назначение, чем итерация.
источник
for(IEnumerator e=collection.GetEnumerator;e.MoveNext();) { ... }
Если рассматриваемая коллекция является
IList<T>
, вы можете просто использоватьfor
с индексацией:Если нет, то вы могли бы использовать
Select()
, это имеет перегрузку, которая дает вам индекс.Если это также не подходит, я думаю, что поддерживать этот индекс вручную достаточно просто, это всего лишь две очень короткие строки кода. Создание ключевого слова специально для этого было бы излишним.
источник
foo(++i)
или вfoo(i++)
зависимости от того, какой индекс нужен.Если все, что вы знаете, это то, что коллекция является IEnumerable, но вам нужно отслеживать, сколько элементов вы обработали до сих пор (и, следовательно, общее количество, когда вы закончите), вы можете добавить пару строк в базовый цикл for:
Вы также можете добавить инкрементную переменную индекса в foreach:
Если вы хотите, чтобы это выглядело более элегантно, вы можете определить метод расширения или два, чтобы «скрыть» эти детали:
источник
Scoping также работает, если вы хотите сохранить блок в чистоте от столкновений с другими именами ...
источник
Для этого я использую
while
цикл. Циклыfor
также работают, и многие люди предпочитают их, но мне нравится использовать толькоfor
то, что будет иметь фиксированное количество итераций.IEnumerable
s может генерироваться во время выполнения, так что, на мой взгляд,while
имеет больше смысла. Назовите это неофициальное руководство по кодированию, если хотите.источник