gpt4 book ai didi

c# - 堆栈和队列枚举顺序

转载 作者:可可西里 更新时间:2023-11-01 08:21:49 27 4
gpt4 key购买 nike

我知道 List 枚举器保证枚举顺序并尊重最后的排序操作,我知道 DictionaryHashSet 不,即你可以确定

Dictionary<string, string> dictionary = ...;

foreach(var pair in dictionary)
{

}

将按照附加的顺序处理对。

StackQueue 呢?他们的调查员是否保证任何顺序?

最佳答案

对于 Stack , 枚举目前由一个名为 StackEnumerator 的嵌套私有(private)类完成(这是来自 Reference Source ):

private class StackEnumerator : IEnumerator, ICloneable
{
private Stack _stack;
private int _index;
private int _version;
private Object currentElement;

internal StackEnumerator(Stack stack) {
_stack = stack;
_version = _stack._version;
_index = -2;
currentElement = null;
}

public Object Clone()
{
return MemberwiseClone();
}

public virtual bool MoveNext() {
bool retval;
if (_version != _stack._version) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumFailedVersion));
if (_index == -2) { // First call to enumerator.
_index = _stack._size-1;
retval = ( _index >= 0);
if (retval)
currentElement = _stack._array[_index];
return retval;
}
if (_index == -1) { // End of enumeration.
return false;
}

retval = (--_index >= 0);
if (retval)
currentElement = _stack._array[_index];
else
currentElement = null;
return retval;
}

public virtual Object Current {
get {
if (_index == -2) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumNotStarted));
if (_index == -1) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumEnded));
return currentElement;
}
}

public virtual void Reset() {
if (_version != _stack._version) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumFailedVersion));
_index = -2;
currentElement = null;
}
}

请注意它是如何从索引设置为 _stack._size-1 开始枚举的并递减索引以按 LIFO 顺序返回每个元素。

但是,因为这没有记录在案,所以您不能保证它永远是这种方式(尽管 Microsoft 现在改变枚举器的工作方式将是疯狂的!)

您可以检查嵌套的 QueueEnumerator 的实现类并类似地确定枚举是按照项目出队的顺序完成的。

Stack.GetEnumerator() 强烈暗示使用后进先出顺序。

如果你看the example for Stack<T>.GetEnumerator() in Microsoft's documentation并检查规定的输出,您可以看到它是后进先出的顺序。

这强烈表明 Microsoft 完全打算按 LIFO 顺序枚举堆栈 - 但他们忘记(或懒得)明确记录这一点!

关于c# - 堆栈和队列枚举顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com