2016-07-22 62 views

回答

3

可以使用实现它LINQ:

Stack<int> stack = new Stack<int>(); 
stack.Push(1); 
stack.Push(2); 
stack.Push(3); 
stack.Push(4); 

int top = stack.ElementAt(0); // Returns 4 
int next = stack.ElementAt(1); // Returns 3 

但是,如果你发现youself试图访问堆栈通过索引上的元素,那你肯定是做错了什么,和你应该重新设计你的解决方案。

+1

我可能是错误的,但堆栈在C#实现为一个数组和两个位置可变的开始和结束(https://msdn.microsoft.com/en-us/library/ms379571(v=vs.80 )的.aspx)。 如果这是真的,我没有看到问题得到按索引元素类似于简单数组中发生的元素。 更重要的是,我很惊讶Stack中没有这样的方法,你必须通过Linq扩展来完成。 –

0

如Matias所示,可以使用ElementAt()。您也可以使用Peek查看顶部的内容,而不用弹出它。您也可以转换为数组并通过索引获取值。

var s = new Stack<int>(); 
s.Push(1); 
s.Push(2); 

var value = s.ToArray()[1]; 

你应该问自己,这是否明智,但。您将能够做的就是在某个时间点获取堆栈的快照。还有一些并发问题需要考虑。

UPDATE:

好像马蒂亚斯,我想出了非常相似的答案。对于问题的问题,他是一个更正确的答案。 ToArray()方法为您提供一致的快照,可能会更加稳定。随后对ElementAt()的调用可能会给你不同的答案,并且如果堆栈已经在调用之间弹出,可能会引发异常。

+0

可以通过做'ElementAt' – TheDude

0

可以通过调用ElementAt(Int32)或ElementAtOrDefault(Int32)方法按索引选择堆栈的元素。

作为一个侧面说明,如果你是新来的C#,总是试图在

1)MSDN 2找到答案)referencesource.microsoft.com

它通常的方式更快,更可靠然后寻找信息上SO =)

相关问题