C#迭代器

csharp

浏览数:732

2019-1-7

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyIterator
{
    class Program
    {
        static readonly String Padding = new string(' ',30);
        static IEnumerable<Int32> CreateEnumerable()
        {
            Console.WriteLine("{0} CreateEnumerable()方法开始", Padding);
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine("开始 yield{0}", i);
                yield return i;
                Console.WriteLine("{0}yield 结束", Padding);
            }
            Console.WriteLine("{0} Yielding最后一个值", Padding);
            yield return -1;
            Console.WriteLine("{0} CreateEnumerable()方法结束", Padding);
        }
        static void Main(string[] args)
        {
            IEnumerable<Int32> iterable = CreateEnumerable();
            IEnumerator<Int32> iterator = iterable.GetEnumerator();
            Console.WriteLine("开始迭代");
            while (true)
            {
                Console.WriteLine("调用MoveNext方法……");
                bool result = iterator.MoveNext();
                Console.WriteLine("MoveNext方法返回的{0}",result);
                if (!result)
                {
                    break;
                }
                Console.WriteLine("获取当前值……");
                Console.WriteLine("获取到的当前值为{0}",iterator.Current);
            }
        }
    }
}
-----------------------------------------------------------------------------
1.直到第一次调用MoveNext,CreateEnumerable中的方法才被调用。
2.在调用MoveNext的时候,已经做好了所有操作,返回Current属性并没有执行任何代码。
3.代码在yield return之后就停止执行,等待下一次调用MoveNext方法的时候继续执行。
4.在方法中可以有多个yield return语句。
5.在最后一个yield return执行完成后,代码并没有终止。调用MoveNext返回false使得方法结束。