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;
}