使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢?
调用arrayLis.GetEnumberator(),返回一个IEnumberator引用。调用所返回的Enumberator接口的MoveNext()方法。如果MoveNext()返回true,就使用IEnumberator接口的Current属性获取对象的一个引用,用于foreach循环。重复前面两步,知道MoveNext方法返回false为止,此时循环停止。迭代器的实现例子:
classPRogram
{publicstaticvoidMain(string[] args)
{foreach(stringstrinSimpleList())
{
Console.WriteLine(str);
}
Console.ReadKey();
}publicstaticIEnumerable SimpleList()
{yieldreturn"1";yieldreturn"2";yieldreturn"3";
}
}
这样我们就实现了一个最简单的迭代器。结果为:
下面给个复杂一点的例子,用迭代器实现返回素数:
publicstaticvoidMain(string[] args)
{
Primes primesFrom2TO1000=newPrimes(2,1000);foreach(longiinprimesFrom2TO1000)
{
Console.Write("{0}", i);
}
}
publicclassPrimes
{privatelongmin;privatelongmax;publicPrimes()
:this(2,200)
{ }publicPrimes(longminimum,longmaximum)
{if(minimum <2)
{
min=2;
}else{
min=minimum;
}
max=maximum;
}publicSystem.Collections.IEnumerator GetEnumerator()//返回类型为一个迭代器{for(longpossiblePrime = min; possiblePrime <= max; possiblePrime++)
{boolisPrime =true;for(longpossibleFactor =2; possibleFactor <= (long)Math.Floor(Math.Sqrt(possiblePrime)); possibleFactor++)
{longremainderAfterDivsion = possiblePrime %possibleFactor;if(remainderAfterDivsion ==0)
{
isPrime=false;
break;
}
}if(isPrime)
{yieldreturnpossiblePrime;//为素数,返回之}
}
}
}
结果为:
迭代器返回的类型有两种:IEnumberable和IEnumerator。
如果要迭代一个类,可使用GetEnumerator(),它的返回类型是IEnumerator。如果要迭代一个类成员,例如一个方法,则使用IEnumerable。