Lambda表达式和Linq查询浅析

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. newlist.Add(item);
  9. }
  10. }
  11. return newlist;
  12. }
  13. private static void LambdaLinq()
  14. {
  15. var classes = GetClasses();
  16. //var students = GetStudents();
  17. //0 原始版本
  18. var result = classes.Filter();
  19. foreach (var item in result)
  20. }
  21. Console.WriteLine(item.ID+ " " + item.Name);
  22. }
  23. }
  24. //相关的工厂方法:
  25. static ClassCollection GetClasses()
  26. {
  27. return new ClassCollection{
  28. new Class(1){ Name = "终极一班"},
  29. new Class(2){ Name = "终极二班"},
  30. };

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

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

我们声明了一个委托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. }

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. }

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

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

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

文章题目:Lambda表达式和Linq查询浅析
分享网址:http://www.hantingmc.com/qtweb/news36/4736.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联