【问题标题】:How to get stack items by index in c#?如何在 C# 中按索引获取堆栈项?
【发布时间】:2016-07-22 20:49:55
【问题描述】:

我是 C# 新手。 是否可以像我们在 C# 中的 Lists 中那样按索引获取堆栈项?

谢谢,

【问题讨论】:

    标签: c# list indexing stack


    【解决方案1】:

    您可以使用 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
    

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

    【讨论】:

    • 我可能错了,但是 C# 中的 Stack 实现为一个数组和两个位置变量 start 和 end (msdn.microsoft.com/en-us/library/ms379571(v=vs.80).aspx)。如果这是真的,我认为通过索引获取元素的方式与在简单数组中发生的方式类似。更重要的是,我很惊讶 Stack 本身没有这样的方法,你必须通过 Linq 扩展来做到这一点。
    • 这就是我在调试器中看到堆栈的方式。我很困惑 stack[0] 是堆栈的顶部。所以显然我看到的不是实际的底层数组,而是 ElementAt(0)。
    • “但是,如果你发现自己试图通过索引访问堆栈中的元素,那么你肯定做错了,你应该重新设计你的解决方案” - 这个只是把事情概括得太多了。根据您使用它的目的,必须按索引检查堆栈有完全有效的用例。我现在的用例:将此自定义解释器从 Java 转换为 C#:craftinginterpreters.com/…
    【解决方案2】:

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

    var s = new Stack<int>();
    s.Push(1);
    s.Push(2);
    
    var value = s.ToArray()[1];
    

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

    更新:

    看起来像马蒂亚斯和我想出了非常相似的答案。对于问题的要求,他的答案更正确。 ToArray() 方法为您提供了可能更稳定的一致快照。对 ElementAt() 的后续调用可能会给您不同的答案,并且如果在两次调用之间弹出堆栈,则可能会引发异常。

    【讨论】:

    • 可以通过ElementAt
    【解决方案3】:

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

    附带说明,如果您是 C# 新手,请始终尝试在以下位置找到答案

    1. MSDN
    2. github
    3. referencesource.microsoft.com

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

    【讨论】:

    • “这通常比在 SO =) 上查找信息更快、更可靠”——真的吗?不是说不是,而是你为什么要在这里回答问题。您会在 StackOverflow 中与 MSDN 相关的所有内容上提出这个建议吗?只是有点惊讶你费心写那个......
    • 因为我有一天发现,很多问基本问题的人都不了解 docs 或 refsource。
    猜你喜欢
    • 2010-09-11
    • 2016-12-22
    • 1970-01-01
    • 2017-03-17
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多