迭代器

1、Foreach只能遍历一个可枚举的集合(就是实现了IEnumerable接口

2、System.Array类、String类等实现了IEnumerable接口。

3、在IEnumerable接口中,包含了一个名为GetEnumerator的方法: IEnumerator  GetEnumerator( );

     GetEnumerator方法返回一个枚举器对象(枚举器对象用于遍历(可枚举)集合中的元素),这个枚举数类实现了IEnumerator接口。

    IEnumerator接口规定了以下属性和方法:

    Ⅰ、Object Current {get;}

  Ⅱ、Bool MoveNext();

  Ⅲ、 Void Reset();

4、 使用一个集合的GetEnumerator方法来创建一个枚举数,然后反复调用MoveNext方法,并获取Current属性的值,就可以每次在该集合中移动一个元素的位置。这正是foreach语句所做的事情。

5、一个迭代器块(iterator block)是一个能够产生有序的值序列的块。迭代器块和普通语句块的区别就是其中出现的一个或多个yield语句。

6、在迭代器块中,使用yield关键字选择要在foreach循环中使用的值。其语法如下:

    yield return value;

   对于迭代器,可以使用下面的语句中断信息返回foreach循环的过程:

    yield break;

   在遇到迭代器中的这个语句时,迭代器的处理会立即中断,就像foreach循环使用它一样。 

7、编译器生成的枚举数中Reset方法没有实现。而它是接口需要的方法,因此调用实现时总是抛出System.NotSupportedException异常。

 public class DaysOfTheWeek : System.Collections.IEnumerable
    {
        string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
        public System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < m_Days.Length; i++)
            {
                yield return m_Days[i];
            }
        }
    }
    class TestDaysOfTheWeek
    {
        static void Main()
        {
            // Create an instance of the collection class
            DaysOfTheWeek week = new DaysOfTheWeek(); // Iterate with foreach 
            foreach (string day in week)
            {
                System.Console.Write(day + " ");
            }

IEnumerator ee= week.GetEnumerator();
while (ee.MoveNext())
{
    Console.WriteLine(ee.Current);
}

   }

    }

 命名迭代器

class Program
    {
        static void Main(string[] args)
        {
            Class1 c = new Class1();

            foreach (int i in c.MaxToMin(1, 2))
            {
                Console.WriteLine(i);
            }

            foreach (object i in c.MinToMax)
            {
                Console.WriteLine(i.ToString());
            }
        }
    }

    class Class1
    {
        // 定义一个命名的迭代器,并可以提供参数
        public IEnumerable MaxToMin(int min, int max)
        {
            for (int i = max; i >= min; i--)
            {
                yield return i; // 返回元素
            }
            yield return "ktgu";
        }

        // 定义一个迭代器类型的属性,
        public IEnumerable MinToMax
        {
            //this表示该类实例,因为该类实现了GetEnumerator(),它是可枚举的
            get { yield return this; }
        }
    }

 

 

 

原文地址:https://www.cnblogs.com/XiaoqiangNiu/p/3666636.html