using System.Collections;
using System.Collections.Generic;
internal class DisposingEnumerator : IEnumerator<Item>
private readonly List<IDisposable> deallocationQueue = new List<IDisposable>();
private readonly IEnumerable<Item> source;
private IEnumerator<Item> sourceEnumerator;
public DisposingEnumerator(IEnumerable<Item> source)
if (sourceEnumerator == null)
sourceEnumerator = source.GetEnumerator();
bool hasNext = sourceEnumerator.MoveNext();
deallocationQueue.Add(Current);
public Item Current => sourceEnumerator.Current;
object IEnumerator.Current => Current;
throw new NotSupportedException();
Console.WriteLine(deallocationQueue.Count);
foreach (var item in deallocationQueue)
public class ItemCollection : IEnumerable<Item>, IDisposable
private bool disposed = false;
private IEnumerator<Item> enumerator;
public ItemCollection(IEnumerable<Item> source)
this.enumerator = new DisposingEnumerator(source);
public IEnumerator<Item> GetEnumerator()
throw new ObjectDisposedException("ItemCollection");
IEnumerator IEnumerable.GetEnumerator()
public class Item : IDisposable
private Guid Id = Guid.NewGuid();
Console.WriteLine($"Disposed {Id}");
public static void Main()
var items = Enumerable.Range(0, 10).Select(x => new Item());
foreach (var item in new ItemCollection(items))
Console.WriteLine("Iteration");