Enumerator Example (Versioned Collection)

image_pdfimage_print
   
 

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