標籤:style blog http io color ar os 使用 sp
使用foreach迴圈是有IEnumerator介面來實現的,IEnumerator即實現了迭代器,在foreach中如何迭代一個集合arrayList呢?
- 調用arrayLis.GetEnumberator(),返回一個IEnumberator引用。
- 調用所返回的Enumberator介面的MoveNext()方法。
- 如果MoveNext()返回true,就使用IEnumberator介面的Current屬性擷取對象的一個引用,用於foreach迴圈。
- 重複前面兩步,知道MoveNext方法返回false為止,此時迴圈停止。
迭代器的實現例子:
class Program { public static void Main(string[] args) { foreach (string str in SimpleList()) { Console.WriteLine(str); } Console.ReadKey(); } public static IEnumerable SimpleList() { yield return "1"; yield return "2"; yield return "3"; } }這樣我們就實現了一個最簡單的迭代器。結果為:
下面給個複雜一點的例子,用迭代器實現返回素數:
public static void Main(string[] args) { Primes primesFrom2TO1000 = new Primes(2, 1000); foreach (long i in primesFrom2TO1000) { Console.Write("{0}", i); } }
public class Primes { private long min; private long max; public Primes() : this(2, 200) { } public Primes(long minimum, long maximum) { if (minimum < 2) { min = 2; } else { min = minimum; } max = maximum; } public System.Collections.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 remainderAfterDivsion = possiblePrime % possibleFactor; if (remainderAfterDivsion == 0) { isPrime = false; break; } } if (isPrime) { yield return possiblePrime;//為素數,返回之 } } } }
結果為:
迭代器返回的類型有兩種:IEnumberable和IEnumerator。
- 如果要迭代一個類,可使用GetEnumerator(),它的傳回型別是IEnumerator。
- 如果要迭代一個類成員,例如一個方法,則使用IEnumerable。
.NET基礎之迭代器