Порядок сортировки при использовании 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 предназначен для перечисления без порядка и подразумевает, что среда выполнения может даже обрабатывать несколько элементов параллельно. Вы никогда не должны полагаться на порядок перечисления.