zoukankan      html  css  js  c++  java
  • 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中创建了一个状态系统,这样我们在代码中无需关心其中某一个时刻状态的维护。

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

                       

        感谢农码一生的精神。

      

                     

  • 相关阅读:
    hadoopnamenode配置及问题处理方案
    hadoop 运行 Java程序
    hadoop命令大全
    DOS
    腾讯Linux QQ安装
    linux下安装realplayer
    在linux中配置安装telnet服务
    关于C#静态构造函数的几点说明
    linux下的Network File Server共享配置
    Oracle学习笔记
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/7922550.html
Copyright © 2011-2022 走看看