Я бы пока не согласился со всеми ответами.
Во-первых, стандарт C # 3.0 гарантирует порядок foreach для массива:
Порядок, в котором проходит foreach
элементы массива, как
следует: для одномерных массивов
элементы пересекаются в увеличении
Порядок индекса, начиная с индекса 0 и
заканчивающийся индексом Длина - 1. Для
многомерные массивы, элементы
пройдено так, что показатели
крайний правый размер увеличен
сначала, затем следующее левое измерение,
и так далее влево.
- C # Язык Спецификация Версия 3.0 , стр. 240.
Во-вторых, для объектов foreach (C #) и For Each (VB.NET) работают с использованием элементов MoveNext, Reset и Current объекта ( source ). Обычно они являются частью интерфейса IEnumerator.
В коллекциях, имеющих порядок (читай: вещи, которые реализуют IList или IList (T)), это означает, что элементы будут возвращены в том порядке, в котором их хранит резервное хранилище.