c#之Linq的原理讲解及封装自己的Linq

在博客园混了太久了,一直都是发一些软软的文章,做技术也要会点营销推广,工作艰辛,大家都懂的,是时候做出一点贡献了,写点有技术含量的文章,言归正传:

前段时间写了一篇文章<<c#之lamda表达式的前世今生>>介绍了lamda的演变来历,由于最近工作忙,今天才抽出点时间来准备写这篇文章,希望能让所有喜欢所有喜欢c#的小伙伴起来一定的启发和帮助,咱们废话不多话,直接上代码。

1、老规矩,定义Student类

2、定义一个集合listStudent

3、任务来了

前提:假设我们还没有学会linq。

领导说,写个方法能找出所有年龄大于20岁的学生集合,好,撸起袖子就写代码,如下:

然后直接调用方法

是不是很简单,完全没毛病。

然后过了一会,需求增加了,领导说:写个方法找出所有在北大上学的学生,Ok,继续撸代码:

然后直接调用方法

对于需求简单的,上面的写法完全没毛病。

但是过了一会,领导又提出诸多要求,分别如下:

1、找出所有年纪大于20岁的清华学生

2、找出所有年纪大于20岁的清华的男学生

3、找出所有年纪大于18岁小于20的清华的女学生

....

太多了,勤奋踏实的小伙伴们开始写新的方法了来满足领导要求,但是对于我来说,我就不干了,这样写什么时候是个头呀,我要另辟途径。

4、懒人们开始学linq了

领导需求太多了,懒人们一个一个写方法,肯定心里憋屈,然后就会去网上找解决方案,ok,找了linq。

上面领导的需求直接通过Linq写:

是不是瞬间感觉轻松了很多,以后有什么要求直接给来就行,一个Where扩展方法完全搞定,逻辑直接通过泛型委托来传递,委托中的方法体直接通过lamda(其实就是匿名函数的语法糖)来书写,代码量大大的减少。

5、封装自己的MyLinq

懒人学会了linq后,以后工作就快乐很多了,其中一部分喜欢折腾的就开始瞎折腾了:

linq那么方便,那么微软到底怎么封装的呢?

高手就是这样炼成的,重复造轮子是最好和最快的学习办法,ok,咱也封装一个自己的MyWhere。

这里需要用到几个知识点:扩展方法、泛型、委托,不了解的朋友请百度搜索,这里我再写篇幅就长了,下面直接封装代码:

扩展方法带两个参数,第一个参数为需要进行赛选的数据源,第二个参数为Func委托,带一个参数,返回bool值。

foreach中通过Invoke方法调用委托来判断是否满足条件,满足条件则加入到我们的结果集合中。

这样我们就可以使用自己封装的委托了。

写到这里,大家应该能明白linq的原理了吧,希望对喜欢c#开发的小伙伴们起到一定的帮助和提高。

posted @ 2019-12-17 17:57  鹅是码农  阅读(1823)  评论(0编辑  收藏  举报