队列如何与foreach循环交互

时间:2015-09-24 08:28:10

标签: c# foreach

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

为清楚起见:

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

2 个答案:

答案 0 :(得分:8)

  

它是否像标准枚举器一样迭代?或者它是否使用   Dequeue()

它不是迭代队列,而是使用Queue<T>.GetElement方法在其内部数组中按索引和存储区查找元素。您可以在implementation of the Enumerator class returned by Queue<T>.GetEnumerator()

中看到这一点
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];
}

答案 1 :(得分:1)

根据documentation

  

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

因此,可以安全地假设在队列中使用foreach不会使任何项目出列。