При использовании .ToList()
дополнительный метод на a Stack<T>
, действительно ли результатом является то же как выталкивающий каждый элемент и добавляющий к новому списку (реверс того, что было продвинуто)?
Если так, это, потому что это действительно выполняет итерации по каждому элементу или делает это хранит элементы наоборот внутренне и подсовывает массив в новое List<T>
?
Стек
не имеет метода ToList
, это метод расширения из класса Enumerable
. Поскольку эти методы расширения работают только с IEnumerable
, можно с уверенностью предположить, что ToList
выполняет итерацию по элементам стека для создания нового списка (или, по крайней мере, действует точно так, как если бы это будет - методы Enumerable
иногда проверяют тип аргумента и используют оптимизированную реализацию).
Интересно, что документация, похоже, не указывает прямо, в каком порядке перечисляется стек, но в примере кода действительно указан порядок, и примеры являются частью документации. Кроме того, на практике изменение порядка итераций сломало бы так много кода, что его было бы слишком рискованно менять сейчас.
Я также проверял с помощью Reflector; Стек
хранит свои элементы в массиве с самым нижним элементом с индексом 0, но его перечислитель
выполняет итерацию по массиву в обратном порядке . Следовательно, первый элемент, который выходит из итератора, является вершиной стека.
ToList
будет итерироваться в том же порядке, как если бы вы сделали вот так:
foreach (T item in stack)
В документации для GetEnumerator()
порядок не указан явно, насколько я могу судить, но пример показывает, что он будет итерироваться, как если бы он был popping. Так что если вы нажмете 1, 2, 3, 4, 5, то ToList
даст вам 5, 4, 3, 2, 1.