Является ли порядок объектов, возвращаемых FOREACH, стабильным?

StackOverflow https://stackoverflow.com/questions/167096

Вопрос

Безопасно ли предполагать, что два итерации в одной коллекции возвращают объекты в одном и том же порядке? Очевидно, предполагается, что коллекция не изменилась иным образом.

Это было полезно?

Решение

Краткий ответ - да.

Очевидно, что порядок элементов в коллекции может быть не таким, как они были вставлены, в зависимости от типа коллекции (например, словарь).

Но вы будете получать одни и те же результаты при каждой итерации по одной неизмененной коллекции с помощью цикла foreach.

Другие советы

Это зависит от типа коллекции. Для большинства коллекций ответом является & Quot; Да & Quot ;.

Однако это не гарантируется. Документы типа коллекции должны указывать, стоит ли это делать или нет, но, как и большинство, эта деталь обычно просматривается. Однако, если он нестабилен, было бы огромным недосмотром, если бы документы не упоминали об этом.

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

Коллекции, имеющие определенный порядок элементов (например, List<T>), будут перечисляться в стабильном порядке.

Для коллекций, в которых состояние объекта не изменяется, весьма вероятно, что элементы вернутся в том же порядке, например Dictionary<K,V>, хотя это не гарантируется спецификацией.

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

Пока ответ & # 8220; да & # 8221; для всех встроенных коллекций и, вероятно, для любого класса вменяемых коллекций, документация не имеет никаких ограничений, сформулированных для IEnumerable. Поэтому ничто не говорит нам о том, что каждая итерация должна быть стабильной.

Я мог бы представить следующий вариант использования:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

Это вполне может быть реализовано как класс, который дает различный порядок для каждой итерации.

Итак, & # 8211; если вы также хотите рассмотреть странные пограничные случаи, ответ должен быть & # 8220; нет & # 8221;.

Хотя обычно элементы возвращаются в том же порядке, абсолютно никаких гарантий нет. Это полностью зависит от внутренней реализации класса коллекции.

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

Короче говоря, если вы не знаете внутреннюю реализацию класса коллекции, не предполагайте ничего о заказе.

Linq определяет интерфейс IOrderedEnumerable для этой цели.

Повторно " без изменений " (Ответ NM) - обратите внимание, что многие сложные контейнеры, такие как Dictionary, не гарантируют сохранение порядка. Иногда добавление элемента делает его последним (создавая впечатление, что порядок сохранен), а иногда это приводит к реорганизации внутренних сегментов, давая совершенно другой порядок.

Такие вещи, как SortedList <, > и т.д., очевидно, имеют свои правила.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top