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

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

                       

        感谢农码一生的精神。

      

                     

  • 相关阅读:
    设计模式——观察者模式
    安卓xml动画
    部署在weblogic上的springboot项目上传文件(servlet方式)
    Spring Boot 部署到weblogic 12c
    SpingBoot+Druid监控页面打不开(404)
    DAY49-前端入门-浮动布局案例、z-index、flex布局、响应式布局、过渡与动画
    DAY48-前端入门-文档流、浮动布局、清浮动、流式布局、定位布局
    DAY46-前端入门-组合选择器、标签a_img_list、盒模型、伪类、盒模型布局
    DAY45-前端入门-css的三种引用方式以及优先级、样式与长度颜色、常用样式、css选择器
    DAY44-前端入门-前端三剑客、第一个页面、常用标签、标签分类
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/7922550.html
Copyright © 2020-2023  润新知