#c# #stack
Вопрос:
Я копирую Stack<string>
, где я использую конструктор с IEnumerable<T> collection
параметром. При проверке полученного кода порядок элементов отличается.
Вот какой-то код:
var stack = new Stack<string>();
stack.Push("value 1");
stack.Push("value 2");
stack.Push("value 3");
var stack2 = new Stack<string>(stack);
var pop1 = stack.Pop();
//pop1 is "value 3"
var pop2 = stack2.Pop();
//pop2 is "value 1"
Как я могу скопировать Stack<T>
так, чтобы в копии были элементы в том же порядке?
Ответ №1:
Решение
Вероятно, вы могли бы использовать метод LINQ Reverse()
:
var stack2 = new Stack<string>(stack.Reverse());
Это должно привести к реверсированию перечисляемого из первого стека таким образом, чтобы он был помещен в новый стек в обратном порядке.
Объяснение
Вы используете Stack(IEnumerable<T>)
конструктор для создания нового стека. Внутренне он повторяет это перечисляемое и помещает каждый элемент в стек.
Перечисляемое для Stack<T>
дает элементы в «порядке всплывания» (т. Е. 3, 2, 1), поэтому в конечном итоге элементы помещаются в новый стек в обратном порядке.
Ответ №2:
Перечисление стека удаляет элементы в обратном порядке, в котором вы их размещаете (это в основном похоже на серию всплывающих вызовов, но фактически не удаляет данные из исходного стека).:
Если затем вы используете этот порядок для заполнения нового стека, порядок будет изменен, как показано ниже:
Old New
1 3
2 2
3 1
v ^
| |
-- 3, 2, 1 --
Возможно, есть лучший способ сделать это, но вы могли бы просто использовать временный стек, чтобы было два разворота, что фактически даст вам одинаковый порядок в конечной цели:
var stack2 = new Stack<string>(new Stack<string>(stack));
Это дало бы:
Old New
=== ===
1 3 1
2 2 2
3 -> 1 >- 3
v | | ^
| | | |
-- 3, 2, 1 -- -- 1, 2, 3 --