Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Итак - если вы также хотите рассмотреть странные пограничные случаи, ответ должен быть " no".

Ответ 5

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

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

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

Ответ 7

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

Вещи вроде SortedList <, > etc, очевидно, имеют свои собственные правила.

Ответ 8

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