使用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”;

        }

    }

复制代码

这样我们就实现了一个最简单的迭代器。结果为:qq截图20141114211249

 

 

下面给个复杂一点的例子,用迭代器实现返回素数:

 

复制代码

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;//为素数,返回之

                }

            }

        }

    }

复制代码

结果为:

 

qq截图20141114212209

 

 

 

迭代器返回的类型有两种:ienumberable和ienumerator。

 

如果要迭代一个类,可使用getenumerator(),它的返回类型是ienumerator。

如果要迭代一个类成员,例如一个方法,则使用ienumerable。