Порядок сортировки при использовании foreach в массиве, списке и т.д.

При повторении через массив с использованием foreach есть ли какие-либо гарантии того, что порядок, в котором возвращаются элементы, является массивом порядка [0], массивом [1], массивом [2],...

Я знаю, что теперь класс Array реализуется, но есть ли какие-либо гарантии для будущих версий фреймворка? Те же вопросы касаются List < > .

Ответ 1

Я бы не согласился со всеми ответами до сих пор.

Во-первых, стандарт С# 3.0 гарантирует порядок foreach в массиве:

Порядок, в котором foreach проходит элементы массива, как следует: для одномерных массивов элементы пересекаются индекс индекса, начиная с индекса 0 и заканчивается индексом Длина - 1. Для многомерные массивы, элементы пересекаются так, что индексы наибольший размер сначала, затем следующее левое измерение, и так далее влево.

- С# Language Specification Version 3.0, стр. 240.

Во-вторых, для объектов, foreach (С#) и для каждого (VB.NET) работают с помощью MoveNext, Reset и текущих членов объекта (источник). Они обычно являются частью интерфейса IEnumerator.

В коллекциях, имеющих порядок (читайте: все, что реализует IList или IList (T)), это означает, что элементы будут возвращены в том порядке, в котором хранится их хранилище.

Ответ 2

Нет никаких гарантий. Большинство реализаций списка/массивов возвращают значения по порядку, но есть определенные исключения, особенно в некоторых из менее распространенных классов коллекций. (Например, в C5 многие коллекции возвращают значения в разных порядках, чем они были добавлены при перечислении.)

Ответ 3

Никакой гарантии по дизайну. foreach предназначен для нумерации нумерации и предполагает, что среда выполнения может обрабатывать одновременно несколько элементов. Вы никогда не должны полагаться на какой-либо порядок перечисления.