新普京网站-澳门新普京 > 前端 > 你真的懂

你真的懂

2019/12/30 00:51

咱俩先研究多少个难点:

  1. 干什么在foreach中不可能更改item的值?
  2. 要实现foreach要求满意哪些条件?
  3. 干什么Linq to Object中要赶回IEnumerable?

接下去,先最早大家的正文。

自身达成迭代器

.net中迭代器是由此IEnumerable和IEnumerator接口来兑现的,今日大家也来依样画葫芦。

第一来探视那四个接口的概念:

澳门新普京 1

澳门新普京 2

并不曾设想的那么复杂。此中IEnumerable只有二个回到IEnumerator的GetEnumerator方法。而IEnumerator中有多个方法加壹特性质。

接下去开垦画瓢,我们继续IEnumerable接口并完结:

澳门新普京 3

上面接纳原有的点子调用:

澳门新普京 4

有情人开首说了,我们一向都以由此foreache来取值的,没有如此使用过啊。行吗,大家来利用foreach循环:

澳门新普京 5

何以说基本上是生龙活虎律的吗?大家先看打印结果,在看反编写翻译代码。

澳门新普京 6

澳门新普京 7

同理可得,两个有那样个事关:

澳门新普京 8

咱俩得以应对第二个难点了“为何在foreach中不能够改革item的值?”:

澳门新普京 9

澳门新普京 ,咱俩还记得IEnumerator的概念吗

澳门新普京 10

接口的定义就唯有get未有set。所以我们在foreach中无法改改item的值。

我们再来回答第二个难点:“要达成foreach要求满足哪些标准?”:

总得贯彻IEnumerable接口?NO

澳门新普京 11

我们和煦写的MyIEnumerable删掉前面包车型客车IEnumerable接口相似能够foreach(不相信?自个儿去测验)。

为此要能够foreach只须要对象定义了GetEnumerator无参方法,何况再次来到值是IEnumerator或其对应的泛型。细看下图:

澳门新普京 12

也正是说,只要可以满足那三步调用就能够。不明确要世袭于IEnumerable。风趣啊!后一次面试官问你的时候断定要争个痛定思痛啊,哈哈!

yield的使用

您早晚发掘了我们自身去完成IEnumerator接口照旧有稍许劳神,况且上边的代码肯定是缺乏完备。没有错,.net给我们提供了更加好的点子。

澳门新普京 13

你会发觉我们连MyIEnumerator都没要了,也得以健康运维。太奇妙了。yield到底为大家做了什么样呢?

澳门新普京 14

新普京网站 ,好东西,大家事情发生前写的那一大坨。你一个yield关键字就消除了。最妙的是那块代码:

澳门新普京 15

那正是所谓的景况机吧!

咱俩后续来看GetEnumerator的概念和调用:

澳门新普京 16

咱俩调用GetEnumerator的时候,看似里面for循环了三次,其实那个时候未有做其余操作。独有调用MoveNext的时候才会相应调用for循环:

澳门新普京 17

现行反革命我想能够回复你“为何Linq to Object中要重返IEnumerable?”:

因为IEnumerable是延迟加载的,每趟访谈的时候才取值。也便是我们在Lambda里面写的where、select并未循环遍历(只是在组装条件卡塔尔国,唯有在ToList或foreache的时候才真正去会集取值了。那样大大进步了品质。

如:

澳门新普京 18

本条时候获得了正是IEnumerable对象,但是未有去此外遍历的操作。(对照上面的gif动图看)

怎样,你依旧不相信?这大家再来做个实验,自身完成MyWhere:

澳门新普京 19

今日看到了吧。实行到MyWhere的时候怎么动作都没有(重返的正是IEnumerable卡塔尔(قطر‎,独有实践到ToList的时候才代码才真正的去遍历筛选。

这里的MyWhere其实能够用扩充方法来兑现,升高逼格。(Linq的这些查询操作符正是以恢宏的花样落到实处的)[打探扩张方法]。

什么高质量的任意取IEnumerable中的值

澳门新普京 20

这段代码来源《深切精晓C#》,个人以为特别妙。贴出来给我们观赏哈。

结束:

demo下载:

上一篇:新特性之类型推断与类型获取新普京网站: 下一篇:每天一个