Linq延迟执行(.Net)

调试代码的时候,突然发现Linq语句不会立即执行,当时一头雾水,因此找资料学习了一下,之后发现身边很多人都忽略了这个细节,所以把他拿出来说一下。

一.特点

1:Linq不会立即执行,某些操作才会触发Linq的真正执行,例如 Foreach,Count(),ToList(),ToArray() 等等。

二.问题

1:由于某些操作会触发Linq执行,这样会导致Linq语句的重复执行,这会比较耗费性能,特别像数据库查询这种场景。

三.解决方案

1:为了减少Linq重复执行的问题,先用ToXXX()这类方法转换成集合(例如ToList()),后续的操作就不会触发Linq的执行了。

四.代码

代码只包含三个部分:
1:定义一个类,类名:Patent(专利),重写了ToString()方法
在这里插入图片描述
2:定义一个静态类,类名:PatentData(专利数据),包含一个专利数组属性
在这里插入图片描述
3:在main方法中演示Linq的使用

  1. :定义一个patents数组
  2. :执行Linq代码
  3. :执行Count()方法
  4. :执行 ToArray()方法
  5. :执行 Count()方法
    在这里插入图片描述

五.代码执行结果

如下图所示:
1.第一步执行Linq代码,并没有真正触发Linq执行
2.第二步执行Count()方法,触发了Linq执行
3.第三步执行 ToArray()方法,也触发了Linq执行
4.第四步执行 Count()方法,没触发了Linq执行
在这里插入图片描述

六.原因

1:第一步执行Linq代码,并没有真正触发Linq执行;
因为Where方法返回的结果代表的是一种用于表示计算的抽象数据类型。这个描述有点绕嘴,可以简单的理解为方法定义。如下图,执行完where语句前后patents的内容。

a:执行where之前的patents内容:
在这里插入图片描述

b:执行where之后的patents内容:
在这里插入图片描述

2:第二步执行Count()方法,触发了Linq执行,第三步执行 ToArray()方法,也触发了Linq执行:
因为Where方法只是方法定义,并没有一个真正的结果集赋值给patents。
在这里插入图片描述
3:第四步执行 Count()方法,没触发Linq执行:
因为第三步执行ToArray()方法得到了集合,并将集合赋值给了patents。因此就不会再次触发Linq代码了。
在这里插入图片描述

六.结论

Linq不会立即执行,某些操作会触发Linq执行,例如 Foreach,Count(),ToList(),ToArray() 等等。

七.注意

在使用Linq时,要避免反复执行Linq语句,这样可能会产生性能问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值