Порядок сортировки при использовании foreach для массива, списка и т. Д. - PullRequest
5 голосов
/ 24 марта 2009

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

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

Ответы [ 3 ]

20 голосов
/ 24 марта 2009

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

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

5 голосов
/ 24 марта 2009

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

0 голосов
/ 24 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...