Чи гарантує List <T> повернення товарів у тому порядку, в якому вони були додані?


81

Чи List<T>завжди гарантує повернення товарів у тому порядку, в якому вони були додані при переліку?

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


20
Незважаючи на те, що ми зараз визначили, як за допомогою експериментальної, так і зворотної інженерії, що List <T> у нинішній формі справді зберігає порядок, було б непогано, якби Microsoft зробила це офіційним і внесла цю гарантію в документацію. Хтось, хто читає це, має певний вплив?
IJ Kennedy,

2
@IJKennedy effin A! і це стосується цілої групи додаткових документів MS. +1 вам. (+100, якби міг). Є тисячі, можливо мільйони розробників MS, які витрачають час на зворотне проектування, тестування тощо, і все через відсутність кількох слів від MS. Хіба вони цього не усвідомлюють? Роки йдуть, і нічого не змінюється.
Jason S,

Відповіді:


68

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

Так що так , ви можете безпечно цим користуватися ...

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

Елементи цієї колекції можна отримати за допомогою цілочисельного індексу. Індекси цієї колекції мають нульовий показник.

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

Список (T) може одночасно підтримувати кілька читачів, якщо колекція не модифікується. Перерахування за допомогою колекції по суті не є потокобезпечною процедурою. У рідкісних випадках, коли перерахування змагається з одним або кількома зверненнями до запису, єдиним способом забезпечити безпеку потоку є блокування колекції протягом усього перерахування. Щоб дозволити доступ до колекції за допомогою декількох потоків для читання та запису, ви повинні здійснити власну синхронізацію.

Ви можете прочитати більше про це на MSDN .


1
Здається, у документі List <T> не вказано, що порядок пошуку такий самий, як і порядок вставки. Наразі воно поводиться так, але це не задокументовано.
Cheeso

це справді правильно, завжди добре про це пам’ятати, а коли це абсолютно критично, не розраховувати на це!
Sander Versluys,

@Cheeso Це гарантує порядок пошуку. Я додав відповідь, яка включає цю деталь.
Алекс Анґас,

Привіт. Ви знаєте, чи однакова поведінка з вбудованою ініціалізацією?
Gioce90

9

Так, 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до наступного елементу .


3
Алекс, я думаю, ти, можливо, зробив висновок, який не є обґрунтованим. "Перший елемент у колекції" не обов'язково співпадає з "першим елементом, який був доданий до колекції". Так само і з "останнім елементом". У документі нічого не сказано про порядок пошуку, пов’язаний із порядком вставки.
Cheeso

Просто цікаво, does AddRange()збережіть порядок переданих йому елементів, чи ви можете вільно обходитися порядком, додаючи їх до внутрішнього масиву? (Очевидно, що всі вони будуть в кінці поточного списку)
Райан Буддіком

Алекс прав. Методи додавання Microsoft спеціально посилаються на порядок у списку (у цьому випадку кінцевий). Як і методи вставки ('вказаний індекс').
Chalky

Як тільки ви помітите, що у списках <> є індексатори масивів та метод Insert () (який приймає індекс), повинно стати очевидним, що їх потрібно впорядковувати. Обидві ці функції вимагають, щоб це було так. Ці методи формують договір з кінцевим користувачем класу про те, що ці значення будуть доступні у вказаному місці, якщо ви пізніше їх не перемістите.
krowe2

Здається, документи оновлені? Тепер він доданий до описів AddRange: l docs.microsoft.com/en-us/dotnet/api/… > Порядок елементів у колекції зберігається у списку <T>.
Деппечі

4

Так. Але це не є частиною специфікації.

Посилання: Клас списку


У такому випадку, залежно від цієї конкретної деталі реалізації буде помилкою, ні?
Cheeso

3
Я не можу знайти посилання на це, ви можете цитувати це?
Аннаката

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.