【发布时间】:2021-12-18 06:19:58
【问题描述】:
我有一个Stack<T>,我用它来堆叠整数元组。现在,我正在使用以下代码返回堆栈的副本,从最旧到最新排序:
public IEnumerable<Tuple<int,int>> GetAllTuples()
{
return this.ToArray<Tuple<int,int>>().Reverse<Tuple<int,int>>();
}
这可行,但我担心ToArray() 返回的顺序可能无法在所有情况下都得到保证。 ToArray() 的文档说明如下:
元素以后进先出 (LIFO) 的顺序复制到数组中,类似于对 Pop 的连续调用返回的元素的顺序。
是否可以假设将来调用ToArray()(进而扩展为.Reverse())将返回相同的订单?我对“类似于”有点失望。如果没有,如何确保元组从最旧到最新返回?
为了进一步说明我的观点,这里有一个例子:
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
stack.Push(4);
stack.Push(5);
int[] toArr = stack.ToArray<int>(); // Yields [5, 4, 3, 2, 1]
int[] toArrReverse = toArr.Reverse<int>(); // Yields [1, 2, 3, 4, 5], which is what I want.
【问题讨论】:
-
该行为已记录在案。它不会改变。你有我的话:)
-
@500-InternalServerError 当我的代码中断时,我会追究你的责任;)
-
使用
Array.Reverse可能更有效,因为它使用相同的数组。也许您应该使用Queue,它使用FIFO 而不是Stack,从而避免了Reverse -
@Charlieface 在编辑时,语义上它的行为类似于堆栈。但是,当“完成”时,步骤是从最旧到最新跟踪的。此外,它只会包含少量元素(认为少于 10 个),因此排序仍然相对较快。