2013-12-06 4 views
4

Кто-нибудь знает, если при итерации на C# BlockingCollection <> элементы берутся из коллекции так же, как это делает BlockingCollection.Take()?Удаляет ли foreach из C# BlockingCollection?

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

Благодаря

EDIT: Конечно, я имел в виду BlockingCollection, но по какой-то причине у BlockingQueue в моей голове, и использовал это.

ответ

2

foreach просто перечисляет через коллекцию. Он никогда ничего не удаляет из любой коллекции.

+1

И на самом деле, если я не ошибаюсь, манипулирование коллекцией внутри foreach запрещено и будет терпеть неудачу во время выполнения. –

+0

@Bartdude - правильный –

+2

Это просто неправда. Рассмотрим, например, использование 'foreach' с [' BlockingCollection .GetConsumingEnumerable() ') (http://msdn.microsoft.com/en-us/library/dd287186%28v=vs.110%29.aspx). проблема заключается в том, что поскольку 'foreach' просто вызывает методы в' IEnumerator ', эффект зависит от конкретной реализации' IEnumerator ', который вызывается, поэтому вы не можете претендовать на то, что будет влиять на использование' foreach'. –

0

В библиотеках .NET нет BlockingQueue<T>.

Предполагая

  1. Вы говорите о BlockingCollection<T>: Нет с помощью Еогеасп вызывает GetEnumerator метод, который возвращает IEnumerator. Стандартные реализации IEnumerator просто перечисляют элементы в коллекции без каких-либо наблюдаемых побочных эффектов. Так как MSDN не говорит об ином относительно BlockingCollection<T>, можно с уверенностью предположить, что эта конкретная реализация также не имеет наблюдаемых побочных эффектов.

  2. Вы говорите о сторонней библиотеке: вам нужно будет проверить ее реализацию, но я думаю, что можно с уверенностью предположить, что она ничего не удаляет из коллекции.

Редактировать: На самом деле, потому что BlockingCollection обертывания вокруг IProducerConsumerCollection<T>, BlockingCollection использует энумератора базового (внутреннего) сбора. Ни одна из реализаций IProducerConsumerCollection<T>, предоставляемых .NET, не модифицирует коллекцию.