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

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

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

Ответ 1

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

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

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

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

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

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

Подробнее об этом можно узнать на MSDN.

Ответ 2

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

Вставка

List<T>.Add Метод

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

Параметр параметра:

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

List<T>.AddRange Метод

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

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

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

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

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

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

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