如何在c#中按索引获取堆栈项?

如何在c#中按索引获取堆栈项?,c#,list,indexing,stack,C#,List,Indexing,Stack,我是C#的新手。 是否可以像在C#中的列表中那样通过索引获取堆栈项 谢谢,您可以使用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 S

我是C#的新手。 是否可以像在C#中的列表中那样通过索引获取堆栈项


谢谢,

您可以使用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
Stack Stack=新堆栈();
堆栈推送(1);
栈推(2);
堆栈推送(3);
堆栈推送(4);
int top=stack.ElementAt(0);//返回4
int next=stack.ElementAt(1);//返回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
Stack Stack=新堆栈();
堆栈推送(1);
栈推(2);
堆栈推送(3);
堆栈推送(4);
int top=stack.ElementAt(0);//返回4
int next=stack.ElementAt(1);//返回3

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

可以使用ElementAt(),如Matias所示。您还可以使用Peek查看顶部的内容,而无需将其弹出。您还可以通过这种方式转换为数组并通过索引获取值

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

var value = s.ToArray()[1];
var s=newstack();
s、 推(1);
s、 推(2);
var值=s.ToArray()[1];
不过,你应该问问自己,这是否明智。您所能做的就是在某个时间点获取堆栈的快照。还需要考虑并发问题。

更新:


看起来Matias和我得出了非常相似的答案。对于这个问题,他的回答更为正确。ToArray()方法为您提供了一个可能更稳定的一致快照。对ElementAt()的后续调用可能会给出不同的答案,如果堆栈在调用之间弹出,则可能引发异常

如Matias所示,可以使用ElementAt()。您还可以使用Peek查看顶部的内容,而无需将其弹出。您还可以通过这种方式转换为数组并通过索引获取值

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

var value = s.ToArray()[1];
var s=newstack();
s、 推(1);
s、 推(2);
var值=s.ToArray()[1];
不过,你应该问问自己,这是否明智。您所能做的就是在某个时间点获取堆栈的快照。还需要考虑并发问题。

更新:


看起来Matias和我得出了非常相似的答案。对于这个问题,他的回答更为正确。ToArray()方法为您提供了一个可能更稳定的一致快照。对ElementAt()的后续调用可能会给出不同的答案,如果堆栈在调用之间弹出,则可能引发异常

通过调用
ElementAt(Int32)
elementatordedfault(Int32)
方法,可以通过索引选择堆栈的元素

顺便说一下,如果你是C#的新手,一定要在


  • 它通常比在SO=)上查找信息更快、更可靠。

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

    顺便说一下,如果你是C#的新手,一定要在


  • 通常比在SO=)上查找信息要快得多,也更可靠。

    通过执行
    ElementAt
    是可能的,通过执行
    ElementAt
    是可能的,我可能是错的,但C中的堆栈实现为一个数组和两个位置变量start和end()。如果这是真的,我认为按索引获取元素没有问题,就像在简单数组中那样。更重要的是,我很惊讶在堆栈本身中没有这样的方法,您必须通过Linq扩展来实现。这就是我在调试器中看到堆栈的方式。我很困惑堆栈[0]是堆栈的顶部。很明显,我看到的不是实际的底层数组,而是ElementAt(0)。“但是,如果您发现自己试图通过索引访问堆栈上的元素,那么您肯定做错了什么,您应该重新设计您的解决方案”-这简直是太笼统了。对于必须按索引检查堆栈,有一些非常有效的用例,这取决于您使用它的目的。我现在的用例:将这个自定义解释器从Java转换为C#:我可能错了,但C#中的堆栈实现为一个数组和两个位置变量start和end()。如果这是真的,我认为按索引获取元素没有问题,就像在简单数组中那样。更重要的是,我很惊讶在堆栈本身中没有这样的方法,您必须通过Linq扩展来实现。这就是我在调试器中看到堆栈的方式。我很困惑堆栈[0]是堆栈的顶部。很明显,我看到的不是实际的底层数组,而是ElementAt(0)。“但是,如果您发现自己试图通过索引访问堆栈上的元素,那么您肯定做错了什么,您应该重新设计您的解决方案”-这简直是太笼统了。对于必须按索引检查堆栈,有一些非常有效的用例,这取决于您使用它的目的。我现在的用例:将这个自定义解释器从Java转换为C#:“它通常比查找SO=)上的信息更快、更可靠”——真的吗?不是说不是,但你为什么在这里回答问题呢。你打算在StackOverflow里的所有东西上建议这个,那里有MSDN的相关参考?我只是有点惊讶你会费心写这篇文章……因为有一天我发现,很多问基本问题的人都不知道文档或参考源。“它通常比查找SO=)上的信息更快、更可靠。”-真的吗?不是说不是,但你为什么在这里回答问题呢。你打算在StackOverflow里的所有东西上建议这个,那里有MSDN的相关参考?只是有点惊讶你会费心去写…因为我