Я думаю, что документация, на которую есть ссылка Ответ Майка ниже , крайне вводит в заблуждение. Порядок For Each
определяется коллекцией, которую он называет (т. Е. Его реализация IEnumerable
/ IEnumerable<T>
), но это , а не , то же самое, что сказать, что его не следует использовать, когда порядок важный. Многие коллекции (например, массивы, List<T>
и т. Д.) Всегда идут в «естественном» порядке.
Часть документации ссылается на это:
Порядок обхода . Когда вы выполняете
Для каждого ... Следующий цикл, обход
Коллекция находится под контролем
объект перечислителя, возвращаемый
Метод GetEnumerator. Получатель чего-то
Обход не определяется визуальным
Основной, а скорее MoveNext
метод объекта перечислителя. это
означает, что вы не сможете
предсказать, какой элемент
коллекция возвращается первой
в элемент, или который будет следующим
возвращается после заданного элемента.
Это совсем не то же самое, что сказать, что на него нельзя положиться - на него можно положиться , если вы знаете, что перебираемая коллекция произведет результаты в нужном порядке . Это не значит, что он будет выбирать элементы наугад. Поведение в терминах IEnumerable
/ IEnumerable<T>
четко определено на этой странице.
Наиболее важными исключениями для предсказуемых порядков являются словари и наборы, которые естественно неупорядочены.
Чтобы изменить IEnumerable<T>
, используйте Enumerable.Reverse
- но если вам нужно выполнить итерацию в обратном порядке по коллекции, индексируемой по позиции (например, массив или List<T>
), тогда будет более эффективно использовать цикл For
, начинающийся с конца и работающий в обратном направлении.