.NET基础之迭代器_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > .NET基础之迭代器

.NET基础之迭代器

 2014/11/14 23:07:25  鬼厉—  程序员俱乐部  我要评论(0)
  • 摘要:使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢?调用arrayLis.GetEnumberator(),返回一个IEnumberator引用。调用所返回的Enumberator接口的MoveNext()方法。如果MoveNext()返回true,就使用IEnumberator接口的Current属性获取对象的一个引用,用于foreach循环。重复前面两步
  • 标签:.net 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" border="0" alt="QQ截图20141114211249" src="/Upload/Images/2014111423/4D5D398EB6A9AAB9.png" width="135" height="97" />

 

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

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。
发表评论
用户名: 匿名