Csharp/C Sharp/Generics/IEnumerator

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

Implement generic IEnumerable and IEnumerator

<source lang="csharp"> 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 );
       }
   }

}

      </source>