ASP.NET Core6.0学习笔记(九)——Enumerable

一、什么是Enumerable

1.Enumerable是“序列”。它与集合是两个概念。LINQ中所有的内容都是针对于某一元素序列执行操作。
2.在LINQ中,其核心思想就是“如何生成序列的下一项”——创建一个枚举器,获取输入并创建枚举
3.LINQ的工作机制:“流式处理”——从集合中逐个拿取数据并执行对应的操作。若碰到Where等语句,不符合条件的数据将不会被拉取到内存当中,提升性能。保证了LINQ不会因为过大的数据量而崩溃。 流式处理运算符将持续读取源元素直到可以生成结果元素。 这意味着可能要读取多个源元素才能生成一个结果元素。与之相对的是非流式处理,程序一次性将所有数据加载到内存当中,再执行后续操作。
4.如何实现数据的“逐个拉取”:yield return关键字。注意:
(1)yield不能单独使用。单独的yield不作为关键字
(2)使用了yield return就不能使用单一的return;
在这里插入图片描述

现在将代码进行如下修改:
在这里插入图片描述

直接运行:
在这里插入图片描述

这个结果窗口几乎是立刻弹出的。也就证明在GenerateStrings()函数中并没有“真正的”去生成一个数量高达int.Max个的字符串,而仅仅是在迭代这个字符串时才进行了内容的生成(懒加载)。
5.关于IEnumerable接口对象,其包含一个方法,即IEnumerator GetEnumerator()。官方给出的解释是“返回一个可以从集合中迭代对象的枚举器(Returns an enumerator that iterates through a collection)”。
关于枚举器IEnumerator对象,转到定义:
在这里插入图片描述

有三个类成员,包括:
(1)object Current:获取当前遍历到的值;
(2)bool MoveNext():向后移动一位并指示这一位是否存在数据,若存在返回true,反之返回false;
(3)void Reset():将数据指针重置为队头(常用于抛出异常——《C#本质论》)

二、分离数据与操作

1.上面的代码比较乱,原因之一就是使用了一些代码来查看序列正在执行的操作。使用LINQ可以将上面的代码进行简化:
在这里插入图片描述

运行:
在这里插入图片描述

2.LINQ的核心思想之一就是将序列的遍历与该序列可以执行的操作分开;
改法1:将上面生成字符串的方法添加一个可以接收自定义字符串生成的方法的重载并调用。代码如下:
在这里插入图片描述

运行:
在这里插入图片描述

结果与修改之前一致。
改法2:现在将i的值进行修改:
在这里插入图片描述

运行:
在这里插入图片描述

原因是在生成序列的时候并不会执行yield retutn,只有当遍历序列(执行foreach循环时)才会执行GenerateStrings方法,此时i的值在遍历之前已经变成50,所以输出50—149
改法3:保持i的值不变,去掉yield return 改为将数据封装到List中返回:
在这里插入图片描述

运行:
在这里插入图片描述

还是生成0—99,说明使用List是立即生成的数据而非懒加载
改法4:在循环中修改用于生成字符串的i的值:
在这里插入图片描述

运行:
在这里插入图片描述

从输出结果可以观察出i每次递增了11,也就是同时执行了i++<int.MaxValue与i+=10两条语句,说明在迭代元素时才会去请求元素(循环体内的代码对数据产生了影响)
例2:
核心思想:将生成序列的每一项的方法(Func委托)与构造整个序列的方法(GenerateStrings())分开
在这里插入图片描述

三、IEnumerable与流有何区别?

1.概念上基本相似,区别在于“流”更加“脆弱”,例如文件流。当我们在读取文件时需要将文件锁定使之不能被删除或修改;而对于序列则支持修改—每次逐个请求元素
2.Enumerable与集合的区别:
(1)集合的每一个位置的元素均已知
(2)Enumerable对象是用于生成集合(序列)的对象,只需要知道当前项Current以及bool MoveNext()方法的实现即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GISer_Qing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值