Гарантирует ли List <T>, что товары будут возвращены в порядке их добавления? - PullRequest
69 голосов
/ 17 января 2009

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

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

Ответы [ 4 ]

58 голосов
/ 17 января 2009

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

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

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

Элементы в этой коллекции могут быть доступ с использованием целочисленного индекса. Индексы в этой коллекции нуль.

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

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

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

7 голосов
/ 15 мая 2014

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

Вставка

List<T>.Add Метод

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

Параметр элемента:

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

List<T>.AddRange Метод

Добавляет элементы указанной коллекции в конец List<T>.

Параметр сбора:

Коллекция, элементы которой должны быть добавлены в конец List<T>.

индексирование

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

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

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

4 голосов
/ 17 января 2009

Да. Но это не часть спецификации.

Ссылка: Список классов

1 голос
/ 17 января 2009

Да в соответствии с этим Тема форума MSDN

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