Гарантирует ли List ‹T›, что элементы будут возвращены в том порядке, в котором они были добавлены?

Всегда ли List<T> гарантирует, что элементы будут возвращены в том порядке, в котором они были добавлены при перечислении?

Обновлено: спасибо за все ответы, ребята, успокаивает меня. Я быстро разобрался с классом List<T> с помощью .NET Reflector (вероятно, должен был сделать это в первую очередь), и действительно, базовое хранилище представляет собой массив T (T[]).


person Kev    schedule 17.01.2009    source источник
comment
Хотя мы теперь определили, посредством экспериментов и обратного проектирования, что List ‹T› в его нынешней форме действительно сохраняет порядок, было бы неплохо, если бы Microsoft сделала его официальным и поместила эту гарантию в документацию. Кто-нибудь, читающий это, имеет какое-то влияние?   -  person I. J. Kennedy    schedule 11.06.2010
comment
@ И.Дж. Кеннеди, черт возьми! и это касается целого ряда других документов MS. +1 вам. (+100, если бы мог). Тысячи, может быть, миллионы разработчиков MS тратят время на обратное проектирование, тестирование и т. Д., И все из-за отсутствия нескольких слов от MS. Неужели они этого не понимают? Проходят годы, а ничего не меняется.   -  person Jason S    schedule 17.11.2011


Ответы (4)


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

Так что да, вы можете использовать его безопасно таким образом ...

Класс List (T) является универсальным эквивалентом класса ArrayList. Он реализует общий интерфейс IList (T) с использованием массива, размер которого динамически увеличивается по мере необходимости.

Доступ к элементам в этой коллекции можно получить с помощью целочисленного индекса. Индексы в этой коллекции отсчитываются от нуля.

Список (T) не гарантирован для сортировки. Вы должны отсортировать список (T) перед выполнением операций (таких как BinarySearch), которые требуют сортировки списка (T).

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

Подробнее об этом можно прочитать на MSDN.

person Sander Versluys    schedule 17.01.2009
comment
Похоже, что в документе List ‹T› не указано, что порядок извлечения такой же, как порядок вставки. На данный момент он так себя ведет, но не задокументирован. - person Cheeso; 25.06.2009
comment
это действительно правильно, всегда хорошо осознавать это, а когда это абсолютно необходимо, не рассчитывать на это! - person Sander Versluys; 26.06.2009
comment
@Cheeso Это действительно гарантирует порядок поиска. Я добавил ответ, который включает эту деталь. - person Alex Angas; 15.05.2014
comment
Привет. Вы знаете, такое же поведение и при встроенной инициализации? - person Gioce90; 18.05.2017

Да, List<T> гарантирует как порядок вставки, так и порядок извлечения , и это задокументировано в MSDN (акцент ниже мой).

Вставка

List<T>.Add Метод

Добавляет объект в конец List<T> .

Параметр позиции:

Объект, который нужно добавить в конец List<T> < / сильный>.

List<T>.AddRange Метод

Добавляет элементы указанной коллекции в конец _6 _.

Параметр коллекции:

Коллекция, элементы которой нужно добавить в конец _7 _.

Воспроизведение

List<T>.Enumerator Структура

Изначально перечислитель располагается перед первым элементом коллекции. В этой позиции Current не определено. Следовательно, перед чтением значения Current необходимо вызвать MoveNext, чтобы переместить перечислитель к первому элементу коллекции.

Current возвращает тот же объект, пока не будет вызван MoveNext. MoveNext устанавливает Current для следующего элемента.

person Alex Angas    schedule 15.05.2014
comment
Алекс, я думаю, вы, возможно, пришли к необоснованному выводу. Первый элемент в коллекции не обязательно совпадает с первым элементом, добавленным в коллекцию. Аналогично с последним элементом. В документе ничего не говорится о том, что порядок извлечения связан с порядком вставки. - person Cheeso; 16.05.2014
comment
Просто интересно, does AddRange() сохранить порядок элементов, переданных ему, или можно беспрепятственно изменять порядок, в котором он добавляет их во внутренний массив? (Очевидно, все они будут в конце текущего списка) - person Ryan Buddicom; 14.05.2015
comment
Алекс прав. Методы Microsoft Add специально относятся к порядку в списке (в данном случае - end). Как и методы Insert («указанный индекс»). - person Chalky; 11.08.2015
comment
Как только вы заметите, что списки ‹› имеют индексаторы массива и метод Insert () (который принимает индекс), должно быть очевидно, что они должны быть упорядочены. Обе эти функции требуют, чтобы это было так. Эти методы формируют договор с конечным пользователем класса о том, что эти значения будут доступны в указанном месте, если вы не переместите их позже. - person krowe2; 02.03.2017
comment
Кажется, документы обновлены? Теперь он добавлен в описания AddRange: l docs.microsoft.com/en-us/dotnet/api/Порядок элементов в коллекции сохраняется в Списке ‹T›. - person Depechie; 21.03.2019

да. Но это не входит в спецификацию.

Ссылка: Класс списка

person Mitch Wheat    schedule 17.01.2009
comment
В таком случае, в зависимости от конкретной реализации, это может быть ошибка, не так ли? - person Cheeso; 25.06.2009
comment
Я не могу найти ссылку на это, вы можете процитировать? - person annakata; 07.06.2010

Да, согласно этому MSDN Тема на форуме

person Spencer Ruport    schedule 17.01.2009
comment
Это ответ только по ссылке ... есть ли шанс, пожалуйста, включить контекст этой ссылки? - person Alex Angas; 15.05.2014