foreach是否从C#BlockingCollection中删除?

时间:2013-12-06 11:16:51

标签: c# foreach behavior blockingqueue blockingcollection

有人知道,当迭代C#BlockingCollection<>时,是否从集合中获取元素,就像BlockingCollection.Take()所做的那样?

BlockingCollection<int> q = new BlockingCollection<int>();
[...]
foreach(int i in q)
{
    //does q still contain i?
}

由于

编辑:当然我的意思是BlockingCollection,但出于某种原因让我想到了BlockingQueue并使用了它。

3 个答案:

答案 0 :(得分:11)

BlockingCollection<T>枚举器不会从集合中删除项目。

但是,从BlockingCollection<T>.GetConsumingEnumerable() DOES 返回的枚举器会从集合中删除项目。

答案 1 :(得分:2)

foreach只是枚举整个集合。它永远不会从任何集合中删除任何东西。

答案 2 :(得分:0)

.NET库中没有BlockingQueue<T>

假设

  1. 您正在谈论BlockingCollection<T>:否。使用foreach调用GetEnumerator方法,该方法返回IEnumeratorIEnumerator的标准实现只是枚举集合中的元素而没有任何可观察到的副作用。由于MSDN没有具体说明BlockingCollection<T>,因此可以安全地假设此具体实施也没有可观察到的副作用。

  2. 你在谈论第三方库:你必须检查它的实现,但我认为可以安全地假设它没有从集合中删除任何内容。

  3. 修改:实际上,由于BlockingCollection环绕IProducerConsumerCollection<T>BlockingCollection使用基础(内部)集合的枚举器。 .NET提供的IProducerConsumerCollection<T>实现都不会修改集合。