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

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

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

3 ответов


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

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

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

-- Спецификация Языка C# Версия 3.0, стр. 240.

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

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


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


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