Csharp/C Sharp/Class Interface/IEnumerator

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

Collection is iterated using the IEnumerator interface

<source lang="csharp"> using System; using System.Collections; public class Starter {

   public static void Main() {
       SimpleCollection simple = new SimpleCollection(new object[] { 1, 2, 3, 4, 5, 6, 7 });
       IEnumerator enumerator = simple.GetEnumerator();
       while (enumerator.MoveNext()) {
           Console.WriteLine(enumerator.Current);
       }
   }

} public class SimpleCollection : IEnumerable {

   public SimpleCollection(object[] array) {
       items = array;
   }
   public IEnumerator GetEnumerator() {
       return new Enumerator(items);
   }
   private object[] items = null;

} public class Enumerator : IEnumerator {

   public Enumerator(object[] items) {
       elements = new object[items.Length];
       Array.Copy(items, elements, items.Length);
       cursor = -1;
   }
   public bool MoveNext() {
       ++cursor;
       if (cursor > (elements.Length - 1)) {
           return false;
       }
       return true;
   }
   public void Reset() {
       cursor = -1;
   }
   public object Current {
       get {
           if (cursor > (elements.Length - 1)) {
               throw new InvalidOperationException("Enumeration already finished");
           }
           if (cursor == -1) {
               throw new InvalidOperationException(
                   "Enumeration not started");
           }
           return elements[cursor];
       }
   }
   private int cursor;
   private object[] elements = null;

}

</source>


IEnumerator Example (Static Collection)

<source lang="csharp"> using System; using System.Collections; public class SimpleCollection : IEnumerable {

   public SimpleCollection(object[] array) {
       items = array;
   }
   public IEnumerator GetEnumerator() {
       return new Enumerator(this);
   }
   private class Enumerator : IEnumerator {
       public Enumerator(SimpleCollection obj) {
           oThis = obj;
           cursor = -1;
       }
       public bool MoveNext() {
           ++cursor;
           if (cursor > (oThis.items.Length - 1)) {
               return false;
           }
           return true;
       }
       public void Reset() {
           cursor = -1;
       }
       public object Current {
           get {
               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 cursor;
       private SimpleCollection oThis;
   }
   private object[] items = null;

}

</source>


iterates two collections simultaneously

<source lang="csharp"> using System; using System.Collections.Generic; public class Starter {

   public static void Main() {
       MyClass obj = new MyClass();
       foreach (int item in obj) {
           Console.Write(item);
       }
   }

} public class MyClass {

   private int[] list1 = new int[] { 0, 2, 4, 6, 8 };
   private int[] list2 = new int[] { 1, 3, 5, 7, 9 };
   public IEnumerator<int> GetEnumerator() {
       for (int index = 0; index < 4; ++index) {
           yield return list1[index];
           yield return list2[index];
       }
   }

}

</source>


yield IEnumerator

<source lang="csharp">

using System; using System.Collections; using System.Collections.Generic; using System.Text;

public class Primes {

   private long min;
   private long max;
   public Primes(long minimum, long maximum) {
       min = minimum;
       max = maximum;
   }
   public IEnumerator GetEnumerator() {
       for (long possiblePrime = min; possiblePrime <= max; possiblePrime++) {
           bool isPrime = true;
           for (long possibleFactor = 2; possibleFactor <= (long)Math.Floor(Math.Sqrt(possiblePrime)); possibleFactor++) {
               long remainderAfterDivision = possiblePrime % possibleFactor;
               if (remainderAfterDivision == 0) {
                   isPrime = false;
                   break;
               }
           }
           if (isPrime) {
               yield return possiblePrime;
           }
       }
   }

} class Program {

   static void Main(string[] args) {
       Primes primesFrom2To1000 = new Primes(2, 1000);
       foreach (long i in primesFrom2To1000)
           Console.Write("{0} ", i);
   }

}

</source>