这节讲一下接口IEnumerable

01

什么是Enumerable

在一些返回集合数据的接口中,我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢?首先它跟C#中的enum关键字所表达的意思是不同的, 从翻译上来看:可枚举的,展开来说就是它的数据是一枚一枚可以让我们列举出来。就像人们排队去打疫苗,排队的人就是可枚举的,他们有的开车,有走着,有早有晚全都按照先来后到的顺序排好队,当医生开始进行打疫苗的工作时,他并不关心有多少人在排队,也不关心是否有人迟到,当然也不能越过第一个人让其后边的人先进来打,他只能说“请下一个人进来打疫苗”,如果没人响应医生就等着,直到有人进来开始接种,当前这个人完成接种后,医生继续叫下一个人,直到所有人都打完疫苗。这样的情景在编程中就体现为对Enumerable数据的操作。

02

接口成员及使用示例

我们先来看接口中有什么,因为IEnumerable接口一般都是用其泛型版,我们直接看这种:

接口内容很简单,但是其中又出现了一个名为IEnumerator的接口,我们可以称之为枚举器,再来看看IEnumerator内部成员:

IEnumerator接口有三个成员,Current就是保存的当前数据对象,MoveNext方法则是将指针指向下个对象(类似打疫苗情景中的"下一位"),Reset则是将指针复位,泛型版接口则对其内部名为Current的成员指定了类型。也就是说通过枚举我们可以获取一个枚举器,通过枚举器我们能找到一个个数据对象,明白了这一点,我们就能大体上了解如何通过IEnumerable来获取数据了,那下面请看代码:

代码中有一个返回IEnumerable<string>的方法,用来模拟数据的产生,其中用到了一个yield关键字,我简单来说yield return就是部分返回(产生了一个数据,就返回一个,yield具体用法请看我上一篇分享的文章:[C#.NET 拾遗补漏] 理解 yield 关键字),这个方法最终的运行效果就是一秒钟返回一个当前时间构成一个IEnumerable<string>集合。

foreach就是为遍历IEnumerable数据打造的,它里边为我们封装了访问枚举器的操作,所以我们用它来遍历数据非常方便,下面来看一下运行效果:

当然,我们也想知道不用foreach应该怎么遍历IEnumerable数据,所以请看如下代码:

拿到枚举器,我们就可以调用MoveNext找数据(为什么要先调用MoveNext,而不是先取值,再调用MoveNext寻找下一个数据,大家可以再次联想一下打疫苗的情景:是先叫人,人到了,才能打疫苗),该方法返回bool值,有数据可寻则返回true,无数据则返回false,这就是循环的关键,运行结果跟上图一致,此处不再展示。

最新文章

  1. Linux桌面选型
  2. oracle 里面定时执行任务,比如存储过程内容等
  3. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
  4. hdu 5465 Clarke and puzzle 二维线段树
  5. scanf从文件中读入,printf写入到文件
  6. Eclipse用法和技巧二十七:定义自己的快速联想词
  7. alt和title的区别与用法
  8. 异常-CDH的service无法启动并抛出异常-org.apache.avro.AvroRemoteException: java.net.ConnectException: Connection refused (Connection refused)
  9. [Ubuntu] 运行.AppImage格式文件
  10. Python-数据库 基本SQL语句
  11. 逆变(contravariant)与协变(covariant)
  12. web到service简单原理例子
  13. HBase相关概念
  14. bootstrap入门项目备份
  15. es5 - array - sort
  16. 京东前端:PhantomJS 和NodeJS在网站前端监控平台的最佳实践
  17. jQuery中的append()和prepend(),after()和before()的差别
  18. table td 实现细边框的样式
  19. django book用户认证学习
  20. TOJ 3750: 二分查找

热门文章

  1. CSS基础-行快属性,hover
  2. Go语言核心36讲(Go语言实战与应用九)--学习笔记
  3. 测试平台系列(79) 编写Redis配置功能(下)
  4. 【论文阅读】Beyond OCR + VQA: 将OCR融入TextVQA的执行流程中形成更鲁棒更准确的模型
  5. 面试官:Java 线程如何启动的?
  6. 【3】蛋白鉴定软件之Mascot
  7. 总结HashSet以及分析部分底层源码
  8. java四则运算规则
  9. 日常Java 2021/11/6
  10. 使用Redis实现令牌桶算法