LINQ学习系列-----2.2 迭代器

       在学习本篇迭代器之前,强烈建议可以先学习一位具有工匠精神博主的文章,链接如下:

              农码一生---先说IEnumerable,我们每天用的foreach你真的懂它吗? 

       本篇文章,是在该博主博文的基础上再次深入的研习。

       建议:在学习迭代器之前,必须先学习IEnumerable、IEnumerator接口(可点击上链接,学习此接口)

       一.什么是迭代器

              教科书说法:

                     说法一:迭代器不会一次性的返回整个集合中的所有值,而是每次只返回一个。

                说法二:一个返回值是集合类型的方法,并用yield return 语句来返回集合中的每一项。

              个人理解:

                     如果掌握SQL的游标知识的同学就可以这样理解,迭代器==游标 Cursor

                     下为一段SQL游标代码:

                                   

                上图就是一段SQL游标的脚本,迭代器可理解为游标。每次调用fetch next from 移动到下一个项(好比IEnumerator接口中的MoveNext())。while循环正是在外部的循环,循环读取每一项。

       二.链接博客的认知

                       

                 上图中下红框处也可以不用循环,可见下处代码。

                 上图我们学习到几点:1.yield return 被包含的方法的返回值类型必须是 继承IEnumerator接口的 类型。

                                           2. 由于迭代器是一个一个项输出,所有在得到本项后,外部加循环(此循环包含MoveNext()方法,类似游标的fetch next from)来输出每一项,并移动至迭代器的下一项。

     三.迭代器的再次认识

            废话不多说,上代码

                            

          运行结果如下图:

                       

          从结果可以看出,GetArray()方法调用时,结果显示没有显示输出。直到调用遍历来调用迭代器来输出每一项内容,然后将每一项内容输出。

          每次遇到 yield return 语句时,该方法都将向调用者返回一个值,foreach循环收到该值之后进行了相应的处理,随后将控制权交回给迭代器方法,再由迭代器方法给出下一个元素。

          上图代码中GetArray()返回类型是IEnumerable,不过看上去返回值并不是IEnumerable,原因在于编译器悄悄完成了所需要的工作---为我们自动生成了一个IEnumerable接口的类型,yield return语句让编译器在IL中创建了一个状态系统,这样我们在代码中无需关心其中某一个时刻状态的维护。

          状态系统可参考链接博客,下图:

                   

    感谢农码一生的精神。

  

                 

原文地址:https://www.cnblogs.com/xiaowangzi1987/p/7922550.html