队列如何与foreach循环交互

本文关键字:循环 交互 foreach 队列 | 更新日期: 2023-09-27 18:14:15

我真的很惊讶这个问题没有答案。例如,我有一个foreach循环遍历队列(我使用的是。net版本)foreach中的队列究竟发生了什么?它只是像标准枚举器一样迭代吗?还是使用Dequeue()功能

清晰的

:

Queue<int> q = new Queue<int>();
foreach(int i in q)
{
    // what happens in this loop?
}

队列如何与foreach循环交互

它只是像标准枚举器一样迭代吗?或者它使用出列()

不是迭代队列,而是使用Queue<T>.GetElement方法在其内部数组中通过索引和桶查找元素。您可以在Queue<T>.GetEnumerator()返回的Enumerator类的实现中看到这一点:

public bool MoveNext() 
{
    if (_version != _q._version)
        ThrowHelper.ThrowInvalidOperationException(
                                    ExceptionResource.InvalidOperation_EnumFailedVersion);
    if (_index == -2)
        return false;
    _index++;
    if (_index == _q._size) 
    {
        _index = -2;
        _currentElement = default(T);
        return false;
    }
    _currentElement = _q.GetElement(_index);
    return true;
}

其中GetElement为:

internal T GetElement(int i)
{
    return _array[(_head + i) % _array.Length];
}

按文档

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

因此,可以安全地假设在队列上使用foreach将不会使任何项目脱离队列。