Lambda表达式和Linq查询浅析
创始人
2024-06-07 02:31:28
0

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

Lambda表达式和Linq查询

接下来我们通过一个例子来看一下Lambda表达式和Linq查询的关系:我们现在想给ClassCollection增加一个过滤方法,方法的目的是能够过滤返回班级名称为“终极一班”的集合来。

1.首先给MyExtention增加这么一个静态方法:

  1. public static ClassCollection Filter(this ClassCollection classes)  
  2. {  
  3. var newnewlist = new ClassCollection();  
  4. foreach (var item in classes)  
  5. {  
  6. if (item.Name=="终极一班")  
  7.  
  8. {  
  9. newlist.Add(item);  
  10. }  
  11. }  
  12. return newlist;  
  13. }  
  14.  
  15. private static void LambdaLinq()  
  16. {  
  17. var classes = GetClasses();  
  18. //var students = GetStudents();  
  19. //0 原始版本  
  20. var result = classes.Filter();  
  21. foreach (var item in result)  
  22. }  
  23. Console.WriteLine(item.ID+ " " + item.Name);  
  24. }  
  25.  
  26. }  
  27.  
  28. //相关的工厂方法:  
  29.  
  30. static ClassCollection GetClasses()  
  31. {  
  32. return new ClassCollection{  
  33. new Class(1){ Name = "终极一班"},  
  34. new Class(2){ Name = "终极二班"},  
  35. };  
  36. }  

2.现在需求发生了变化,需要上面的红色部分需要发生变化,也就是说我们希望这个查询条件可以在我们调用Filter方法的时候动态的指定,这时候我们可以把这个变化封装成一个接口,当然还可以封装成一个委托,这是.net的非常好用的独有特性,委托的最直接的作用可以把一个具体的方法引用封装成一个变量传递。好,开始变形!

  1. delegate bool FilterHandler(Class c);   
  2. //注意这个要放到namespace下面,不要放到Program类里面  
  3.  
  4. public static ClassCollection Filter(this ClassCollection classes,FilterHandler f)  
  5. {  
  6. var newnewlist = new ClassCollection();  
  7. foreach (var item in classes)  
  8. {  
  9. if (f(item))  
  10.  
  11. {  
  12. newlist.Add(item);  
  13. }  
  14. }  
  15. return newlist;  
  16. }  
  17.  
  18. static bool F(Class c)  
  19. {  
  20. return c.Name == "终极一班";  
  21. }  
  22.  
  23. private static void LambdaLinq()  
  24. {  
  25. var classes = GetClasses();  
  26. // C#1.0 使用委托封装过滤条件  
  27. FilterHandler f=new FilterHandler(F);  
  28. var result = classes.Filter(f);  
  29. foreach (var item in result)  
  30. {  
  31. Console.WriteLine(item.ID+ " " + item.Name);  
  32. }  
  33.  
  34. }

我们声明了一个委托FilterHandler,只要满足这个委托的方法我们都可以传递给Filter方法,这样就实现了动态的改变查询条件的目的,F方法内部可以是任意的查询条件比如return c.Name != "终极一班";同时我们不需要改变Filter方法内部稳定的部分。

3.c#2.0里面也支持直接把一个方法传给一个委托,但本质上也是编译器把方法转换成了一个委托,例如上面:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. // C#2.0 直接传递方法  
  5. var result = classes.Filter(F);  
  6. foreach (var item in result)  
  7. {  
  8. Console.WriteLine(item.ID+ " " + item.Name);  
  9. }  
  10.  
  11. }  

4.C#2.0里面有个新特性,叫匿名方法,我们可以直接传递匿名方法:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. // C#2.0 传递匿名方法  
  5. var result = classes.Filter(delegate(Class c) { return c.Name == "终极一班"; });  
  6. foreach (var item in result)  
  7. {  
  8. Console.WriteLine(item.ID+ " " + item.Name);  
  9. }  
  10.  
  11. }  

好,变形到这里,我们发现这个匿名其实不仅仅可以给我们带来不用给方法命名的好处,在这个方法内部我们还可以使用外部上下文环境的变量成员,这个特性也叫“闭包(Closure)”,JavaScript也支持这个特性,比如:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();   
  4.  
  5. string className = "终极一班";  
  6. // C#2.0 传递匿名方法  
  7.  
  8. var result = classes.Filter(delegate(Class c) { return c.Name == className; });  
  9. foreach (var item in result)  
  10. {  
  11. Console.WriteLine(item.ID+ " " + item.Name);  
  12. }  
  13.  
  14. }  

以上介绍Lambda表达式和Linq查询。

【编辑推荐】

  1. LINQ to SQL查询分析
  2. LINQ查询架构简单介绍
  3. LINQ to SQL映射关系概述
  4. LINQ To SQL对象模型浅析
  5. LINQ to SQL映射列描述

相关内容

热门资讯

如何允许远程连接到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 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...