迭代集合的不同方式(yield return)

在下面这个比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 ( );
原文地址:https://www.cnblogs.com/xiaoyu5062/p/2580549.html