我怎样才能复制 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 --+
我正在复制一个 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 --+