在下面这个比HelloWord略大但比较真实的示例中,可以使用yield return语句,以不同方式迭代集合的类。类BookTitles可以默认方式通过GetEnumerator()方法迭代标题,用Reverse()方法逆序迭代标题,用Subset()方法迭代子集。
public class BookTitles { string[ ] names = {"A","B","C","D"}; /// <summary> /// 迭代标题 /// </summary> /// <returns></returns> public IEnumerator<string> GetEnumerator ( ) { for ( int i = 0; i < 4; i++ ) { yield return names[i]; } } /// <summary> /// 逆序迭代标题 /// </summary> /// <returns></returns> public IEnumerable<string> Reverse ( ) { for ( int i =3; i >= 0; i-- ) { yield return names[i]; } } /// <summary> /// 迭代子集 /// </summary> /// <param name="index"></param> /// <param name="length"></param> /// <returns></returns> public IEnumerable<string> Subset ( int index, int length ) { for ( int i = index ; i < index +length ; i++ ) { yield return names[i]; } } }
注:类支持的默认迭代是定义为返回IEnumerator的GetEnumerator()方法,命名的迭代返回IEnumerable。
迭代字符串数组的客户端代码先使用GetEnumerator()方法,该方法不必在代码中编写,因为这是默认使用的方法。然后逆序迭代标题,最后将索引和要迭代的项数传给Subset()方法,来迭代子集。
var titles = new BookTitles ( ); foreach ( var item in titles ) { Console.Write ( item+" " ); } Console.WriteLine ( "\n Reverse"); foreach ( var item in titles.Reverse() ) { Console.Write ( item+" " ); } Console.WriteLine ("\n Subset" ); foreach ( var item in titles.Subset(2,2) ) { Console.Write(item +" " ); } Console.ReadKey ( );