Csharp/C Sharp/Generics/IEnumerator — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Версия 15:31, 26 мая 2010

Implement generic IEnumerable and IEnumerator

using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
public class MyEnumerable<T> : IEnumerable<T>
{
    public MyEnumerable( T[] items ) {
        this.items = items;
    }
    public IEnumerator<T> GetEnumerator() {
        return new NestedEnumerator( this );
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
    // The enumerator definition.
    class NestedEnumerator : IEnumerator<T>
    {
        public NestedEnumerator( MyEnumerable<T> coll ) {
            Monitor.Enter( coll.items.SyncRoot );
            this.index = -1;
            this.coll = coll;
        }
        public T Current {
            get { return current; }
        }
        object IEnumerator.Current {
            get { return Current; }
        }
        public bool MoveNext() {
            if( ++index >= coll.items.Length ) {
                return false;
            } else {
                current = coll.items[index];
                return true;
            }
        }
        public void Reset() {
            current = default(T);
            index = 0;
        }
        public void Dispose() {
            try {
                current = default(T);
                index = coll.items.Length;
            }
            finally {
                Monitor.Exit( coll.items.SyncRoot );
            }
        }
        private MyEnumerable<T> coll;
        private T current;
        private int index;
    }
    private T[] items;
}
public class EntryPoint
{
    static void Main() {
        MyEnumerable<int> integers = new MyEnumerable<int>( new int[] {1, 2, 3, 4} );
        foreach( int n in integers ) {
            Console.WriteLine( n );
        }
    }
}