我怎样才能复制 Stack<T> 使得副本的顺序相同?

How can I copy a Stack<T> such that the copy is in the same order?

我正在复制一个 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> 以便副本中的项目顺序相同?

解决方案

您或许可以使用 LINQ 的 Reverse() 方法:

var stack2 = new Stack<string>(stack.Reverse());

这应该具有从第一个堆栈中反转可枚举的效果,以便将其反向推入新堆栈。

说明

您正在使用 Stack(IEnumerable<T>) 构造函数创建新堆栈。 Internally 它正在迭代可枚举并将每个项目推入堆栈。

Stack<T> 的可枚举生成“弹出顺序”中的项目(即 3、2、1),因此它最终以相反的顺序将项目推入新堆栈。

枚举堆栈会按照您放置它们的相反顺序提取项目(这基本上就像一系列 pop 调用,但实际上并没有从原始堆栈中删除数据):

如果您随后使用该顺序填充新堆栈,则顺序将相反,如下所示:

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