标签:
常见的迭代器模式有以下两种,我们可以创建迭代器来返回可枚举类型或枚举器。
下面演示如何使用迭代器创建可枚举类。
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创建的枚举器。
标签:
原文地址:http://www.cnblogs.com/leijiangtao/p/4180362.html