zoukankan      html  css  js  c++  java
  • .NET基础之迭代器

    使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢?

    1. 调用arrayLis.GetEnumberator(),返回一个IEnumberator引用。
    2. 调用所返回的Enumberator接口的MoveNext()方法。
    3. 如果MoveNext()返回true,就使用IEnumberator接口的Current属性获取对象的一个引用,用于foreach循环。
    4. 重复前面两步,知道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。
  • 相关阅读:
    ogre terrain
    error list
    Basic Turtorial 3( Ogre wiki)
    操作 Wave 文件(3): 接触 mmio 系列函数
    操作 Wave 文件(5): 获取 Wave 文件的格式信息
    操作 Wave 文件(6): 获取 Wave 文件的波形数据
    关于动态数组指针操作的两个例子
    操作 Wave 文件(7): 建立一个空的 Wave 文件(三种方法)
    操作 Wave 文件(8): 使用 TMediaPlayer 录制 wav 文件
    操作 Wave 文件(10): 输入输出设备与格式支持
  • 原文地址:https://www.cnblogs.com/laoqi/p/4098209.html
Copyright © 2011-2022 走看看