Для поддержки этого поведения требуется довольно сложная внутренняя обработка, поэтому большинство коллекций не поддерживают это (я не уверен насчет пространства имен Concurrent
).
Однако вы можете очень хорошо смоделировать это поведение, используя неизменяемые коллекции. Они не позволяют вам модифицировать коллекцию по проекту, но вы можете работать с ними немного по-другому, и этот тип обработки позволяет вам использовать перечислитель одновременно без сложной обработки (реализовано в Concurrent
коллекции).
Вы можете легко реализовать подобную коллекцию или использовать FSharpList<T>
из FSharp.Core.dll
(хотя и не является стандартной частью .NET 4.0):
open Microsoft.FSharp.Collections;
// Create immutable list from other collection
var list = ListModule.OfSeq(anyCollection);
// now we can use `GetEnumerable`
var en = list.GetEnumerable();
// To modify the collection, you create a new collection that adds
// element to the front (without actually copying everything)
var added = new FSharpList<int>(42, list);
Преимущество неизменяемых коллекций состоит в том, что вы можете работать с ними (создавая копии), не затрагивая оригинал, и поэтому желаемое поведение «бесплатно». Для получения дополнительной информации, есть замечательная серия Эрика Липперта .