стек. ToList () – порядок элементов?

При использовании .ToList() дополнительный метод на a Stack<T>, действительно ли результатом является то же как выталкивающий каждый элемент и добавляющий к новому списку (реверс того, что было продвинуто)?

Если так, это, потому что это действительно выполняет итерации по каждому элементу или делает это хранит элементы наоборот внутренне и подсовывает массив в новое List<T>?

15
задан Uwe Keim 1 October 2019 в 07:50
поделиться

2 ответа

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

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

Я также проверял с помощью Reflector; Стек хранит свои элементы в массиве с самым нижним элементом с индексом 0, но его перечислитель выполняет итерацию по массиву в обратном порядке . Следовательно, первый элемент, который выходит из итератора, является вершиной стека.

15
ответ дан 1 December 2019 в 03:24
поделиться

ToList будет итерироваться в том же порядке, как если бы вы сделали вот так:

foreach (T item in stack)

В документации для GetEnumerator() порядок не указан явно, насколько я могу судить, но пример показывает, что он будет итерироваться, как если бы он был popping. Так что если вы нажмете 1, 2, 3, 4, 5, то ToList даст вам 5, 4, 3, 2, 1.

7
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: