队列如何与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?
}
它只是像标准枚举器一样迭代吗?或者它使用出列()
不是迭代队列,而是使用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
将不会使任何项目脱离队列。