迭代器

 
   
迭代器

可枚举类和枚举器在.NET集合类中被广泛使用,所以熟悉他们如何工作很重要。不过,虽然我们已经知道了如何

创建自己的可枚举类和枚举器了,但是我们还是很高兴的听到,c#从2.0版本开始提供了更简单创建枚举器和可枚举

类型的方式。实际上,编译器将为我们创建他们。这种结构叫做迭代器(iteration)。我们可以把手动编码的

可枚举类型和枚举器替换为由迭代器生成的可枚举器和枚举类。

迭代器块

迭代器块是有一个或者多个yield语句的代码块。

下面这三种类型的代码块中的任何一种都可以迭代器块:

方法主体;

访问器主体;

运行算符主体。

迭代器块与其他的代码块不同。

另一方面,迭代器块不是需要在同一时间执行一连串命令式命令,而是描述了希望编译器为我们创建的枚举器

类的行为。

迭代器块中有两个特殊的语句。

yield return 语句指定了序列中返回的下一项。

yield break 语句指定了序列中没有其他项。

根据枚举器的返回类型你可以让迭代器返回枚举器或者可枚举类型。

public IEnumerator method_1()

{

 .....

 yield return;//产生枚举器的迭代器

}

public IEnumerator method_1()

{

 .....

 yield return;//产生可枚举类型的迭代器

}

常见的迭代器模式有以下两种,我们可以创建迭代器来返回可枚举类型或枚举器。
下面演示如何使用迭代器创建可枚举类。

print方法是一个迭代器块,可以为A类产生并返回枚举器的方法。

A类还实现了getenumrator方法,他调用print并且返回print返回的枚举器。

注意main方法,由于A类实现了getenumrator方法方法,是可枚举类型,我们在foreach语句中直接使用类的实例。
namespace ConsoleApplication1

{

    class A

    {

        

        string str_1="111";

        string str_2 = "222";

        string str_3 = "333";

        public IEnumerator<string> GetEnumerator()

        {return print();           //返回枚举器

        }

        public IEnumerator<string>print()//IEnumrator<string>的意思为--->返回枚举器                                 

        {

            yield return str_1;

            yield return str_2;

            yield return str_3;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            A obj = new A();

            foreach (string str in obj)

                Console.WriteLine(str);

            Console.Read();

            

        }

    }

}

解析:print迭代器方法返回IEnumrator<string>,A类通过返回的由print返回的对象来实现GetEnumerator方法----->这句话很重要,上面代码的说明
当我们实现了返回枚举器的迭代器时,必须通过实现GetEnumerator来让类可枚举,他返回由迭代器返回的枚举器。
把类A改为如下,输出和上面同样的结果
class
A { string str_1 = "111"; string str_2 = "222"; string str_3 = "333"; public IEnumerator<string> GetEnumerator() { yield return str_1; yield return str_2; yield return str_3; } }
使用迭代器来创建可枚举类型
namespace
ConsoleApplication1 { class A { string str_1 = "111"; string str_2 = "222"; string str_3 = "333"; public IEnumerable<string> print()//IEnumerable<string>的意思为返回可枚举类型 { yield return str_1; yield return str_2; yield return str_3; } } class Program { static void Main(string[] args) { A obj = new A(); foreach (string str in obj.print())//注意这儿和上面不一样的,调用的是obj.print()而不是obj Console.WriteLine(str); Console.Read(); } } }
//输出结果和上面的一样。如果不实现GetEnumerator使类本身不可枚举,仍然可以使用由迭代器返回的可枚举器类,只需要直接调用迭代器方法。

 


namespace
ConsoleApplication1 { class A { string str_1 = "111"; string str_2 = "222"; string str_3 = "333"; public IEnumerator<string> GetEnumerator() { IEnumerable<string> myIEnumerable = print();//获取可枚举类型 return myIEnumerable.GetEnumerator();//获取枚举器 } public IEnumerable<string> print()//IEnumerable<string>的意思为返回可枚举类型 { yield return str_1; yield return str_2; yield return str_3; } } class Program { static void Main(string[] args) { A obj = new A(); foreach (string str in obj)//也可以写成foreach (string str in obj.print()),因为print它返回的是可枚举类型 Console.WriteLine(str); Console.Read(); } } }
如果实现了GetEnumerator,让它调用迭代器方法以获取自动生成的实现IEnumrable的类实例。然后从IEnumerable对象返回由GetEnumrator创建的枚举器。

 

 

 

你可能感兴趣的:(迭代器)