【问题标题】:Order of `Stack<T>` in .NET.NET 中 `Stack<T>` 的顺序
【发布时间】:2018-10-11 18:46:18
【问题描述】:

枚举时Stack&lt;T&gt; 是否有定义的顺序?是否保证先取底部(第一个插入)或顶部(最后插入)? documentation for GetEnumeratorStack&lt;T&gt;.Enumerator 都没有明确指定,除了它在“第一个元素”之前开始,这在 Stack&lt;T&gt; 的情况下有点模棱两可。

【问题讨论】:

  • 这取决于,如果文档实际上是 记录 顺序,那么这里的示例 - docs.microsoft.com/nb-no/dotnet/api/… - 显示顺序是从上到下(即最后推送先推)。
  • @LasseVågsætherKarlsen 是的,例子可能具有欺骗性。
  • 在逻辑上没有为堆栈或队列定义枚举,因此没有定义枚举的顺序。图书馆甚至允许您“看到”堆栈中“下一个”或“顶部”项目之外的事实,这对我来说很奇怪。

标签: .net stack


【解决方案1】:

GetEnumerator 可能是为 Stack 唯一实现的。让我们看看:

来自https://referencesource.microsoft.com/#System/compmod/system/collections/generic/stack.cs

    // Pushes an item to the top of the stack.
    // 
    /// <include file='doc\Stack.uex' path='docs/doc[@for="Stack.Push"]/*' />
    public void Push(T item) {
        if (_size == _array.Length) {
            T[] newArray = new T[(_array.Length == 0) ? _defaultCapacity : 2*_array.Length];
            Array.Copy(_array, 0, newArray, 0, _size);
            _array = newArray;
        }
        _array[_size++] = item;
        _version++;
    }

    // Returns an IEnumerator for this Stack.
    /// <include file='doc\Stack.uex' path='docs/doc[@for="Stack.GetEnumerator"]/*' />
    public Enumerator GetEnumerator() {
        return new Enumerator(this);
    }

..所以看起来最后一个是枚举器中的最后一个,第一个推送的将是 foreach 中的第一个。我看不到 return new Enumerator(this) 的哪里有 this 自动装箱的枚举器ctor,但是嘿,我猜它是内部数组。

【讨论】:

  • 如果没有记录,则无法保证。我正在寻找的不仅仅是参考来源。
  • 您可以编写一两个单元测试来尝试一些 Push、Pop 等序列?一些经验证据,如果你愿意的话。另外,我认为参考源是最终的文档......你为什么不这么认为?
猜你喜欢
  • 2021-12-18
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2011-12-02
  • 2019-04-29
相关资源
最近更新 更多