这似乎是一个错误。考虑以下:
......然后:
在做了一些检查之后,我找到了this answer as to some 'reversal' in stack order。
期望第二个堆栈与原始堆栈的顺序相同是不正确的?
这是一个错误吗?
答案 0 :(得分:6)
不,这不是错误。
堆栈将首先生成最近添加的项目。所以当你去填充新的堆栈时,你首先要添加最新的项目。由于此项目首先被添加,现在它将成为新堆栈中“最旧”的项目,即使它是旧堆栈中的“最新”项目。
逆转是完全预期的行为。
如果你有一个队列,那么写var newQueue = new Queue<T>(oldQueue);
将有效地创建一个副本。队列首先生成最旧的项目,因此旧队列中最旧的项目将成为新队列中最旧的项目。列表也是如此。
您似乎认为存在某种复制构造函数,其中堆栈需要另一个堆栈并进行复制。这是不真实的,它只接受IEnumerable<T>
作为输入。对于List
和Queue
,这具有复制的效果,因为堆栈只是具有反转项目的效果。
答案 1 :(得分:2)
这是设计的。
请注意,您使用的constructor overload of Stack<T>
需要IEnumerable<T>
。它的工作方式是迭代IEnumarable<T>
并将项目添加到堆栈。
现在,您正在传递另一个Stack<T>
作为参数。预期IEnumerable<T>
的行为方式是按照从堆栈中取出它们时的顺序给出项目(即LIFO:Last-In First-Out)。
因此,事实上,这些操作有望扭转堆栈。