using System; using System.Collections; public class Starter { public static void Main() { MyCollection simple = new MyCollection(new object[] { 1, 2, 3, 4, 5, 6, 7 }); IEnumerator enumerator = simple.GetEnumerator(); enumerator.MoveNext(); Console.WriteLine(enumerator.Current); enumerator.MoveNext(); simple[4] = 10; Console.WriteLine(enumerator.Current); enumerator.MoveNext(); } } public class MyCollection : IEnumerable { public MyCollection(object[] array) { items = array; version = 1; } public object this[int index] { get { return items[index]; } set { ++version; items[index] = value; } } public IEnumerator GetEnumerator() { return new Enumerator(this); } private class Enumerator : IEnumerator { public Enumerator(MyCollection obj) { oThis = obj; cursor = -1; version = oThis.version; } public bool MoveNext() { ++cursor; if (cursor > (oThis.items.Length - 1)) { return false; } return true; } public void Reset() { cursor = -1; } public object Current { get { if (oThis.version != version) { throw new InvalidOperationException("Collection was modified"); } if (cursor > (oThis.items.Length - 1)) { throw new InvalidOperationException("Enumeration already finished"); } if (cursor == -1) { throw new InvalidOperationException("Enumeration not started"); } return oThis.items[cursor]; } } private int version; private int cursor; private MyCollection oThis; } private object[] items = null; private int version; }