Linq Lambda表达式详细介绍
创始人
2024-06-07 08:11:03
0

C#3.0有很多值得学习的地方,这里我们主要介绍Linq查询,包括介绍Linq Lambda表达式等方面。

C#3.0时代的Linq查询语句

在C#3.0中我们又有了改善代码的新工具。

匿名委托很不错,但是我们希望有更简单的,更容易维护的代码。C#3.0提供了Linq Lambda表达式的概念,你可以把Linq Lambda表达式是我们应用匿名委托的捷径,下面是用Linq Lambda表达式重写的查询:

  1. static IEnumerable 
  2. GoldWatch(IEnumerable employees) {  
  3. return Filter(employees,  
  4. employee => employee.Years>3  
  5. );  
  6. }  
  7.    
  8. static IEnumerable 
  9. SalesForce(IEnumerable employees) {  
  10. return Filter(employees,  
  11. employee => employee.Department=="Sales"  
  12. );  

这段代码相当简单而且也很容易维护,但还存在一些问题。
◆GoldWatch(employees)
◆SalesForce(employees)

当你看到这样的调用的时候就会意识到这个问题,从OO的视角来看,我们已经熟悉了noun.verb()这样的调用形式,理想情况下,我们希望用这样的语法能查询一个集合:
◆employees.GoldWatch()
◆employees.SalesForce()

有人可能会定义一个新的Employee类,它实现了IEnumerable。但是问题是,我们的用户可能会希望是用别的 IEnumerable实现,比如Employee[]和List

C#3.0用扩展方法(Extension method)解决这个方法:

  1. static IEnumerable 
  2. Filter(this IEnumerable employees, Choose choose) {  
  3. foreach (Employee employee in employees) {  
  4. if (choose(employee)) {  
  5. yield return employee;  
  6. }  
  7. }  
  8. }  
  9.    
  10. static IEnumerable 
  11. GoldWatch(this IEnumerable employees) {  
  12. return employees.Filter(employee => employee.Years>3);  
  13. }  
  14.  
  15. static IEnumerable 
  16. SalesForce(this IEnumerable employees) {  
  17. return employees.Filter(  
  18. employee => employee.Department=="Sales");  

这看起来很好了,但如果我们想象Employee一样查询Customer呢?或者说,查询我们的存货呢?

不用为每一个类单独写一个Filter方法,我们可以将Filter写成一个通用函数:

  1. delegate bool Choose(T t);  
  2.  
  3. static IEnumerable 
  4. Filter(this IEnumerable items, Choose choose) {  
  5. foreach (T item in items) {  
  6. if (choose(item)) {  
  7. yield return item;  
  8. }  
  9. }  
  10. }  
  11.  
  12. //现在我们可以筛选我们希望的任何类型了!  
  13.  
  14. int [] a = new int [] {1,2,3,4,5};  
  15. a.Filter(i => i==1 || i==3);  
  16.  
  17. //这个筛选方法是如此有用且通用,C#里已经内置了一个称为Where的实现  
  18. //在PDC上展示的实际的Where实现  
  19.  
  20. public delegate T Func, T>(A0 arg0);  
  21.  
  22. public static  
  23. IEnumerable Where(this IEnumerable source,  
  24. Func, bool> predicate) {  
  25. foreach (T element in source) {  
  26. if (predicate(element)) yield return element;  
  27. }  

【编辑推荐】

  1. Linq查询二维数组浅析
  2. 学习Linq经验总结
  3. Linq修改XML文档描述
  4. Linq延时执行全面分析
  5. Linq实现Left join

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...