Csharp/C Sharp/Class Interface/IEnumerator
Содержание
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>