Как я могу скопировать стек таким образом, чтобы копия была в том же порядке?

#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 --