细说针对C#中的Lambda表达式优化

开发 后端
对于Lambda表达式主题代码的重复问题,本文将给出一个优化解决方案,希望对大家有所帮助。

使用Lambda表达式将会造成Lambda表达式主题部分的代码重复.

  1. var allEmployees = new List<Employee>() { 
  2. new Employee { 
  3. EmployeeId = 1, Classification = 1, FirstName = "Skin", LastName = "Sen" } };  
  4. var earlyFolks = from e in allEmployees  
  5. where e.MonthlySalary < 4000 && e.Classification == 1 && e.YearsOfService > 20  
  6. select e; 

若每当我们要获取一次不同工薪阶层的数据.就要重复一次.相信久经"高重用,松耦合"定律的你.肯定会想尽办法将其实现高重用,松耦合.在以前方法调用的时代.可能你会将其提炼出

  1. private static bool LowPaidSalaried(Employee e, int salar)  
  2.         {  
  3.    return e.MonthlySalary < salar && e.Classification == 1;  
  4.         } 

这样,每次我们调用的时候,将大大减少代码量,提高可复用性.

  1. var earlyFolks = from e in allEmployee  
  2.     where LowPaidSalaried(e, 4000) && e.YearsOfService > 20  
  3.     select e; 

然而,很不幸的是.在这里.这种重构的方式反倒降低了其可重用性.实际上,***种方法的可重用性比第二种方法更高些.为什么呢?明明已经提炼出重用方法了.这与Lambda表达式的求值,解析以及最终的执行方式有关.

前面的<<LINQ表达式与方法调用的映射>>里说过.编译器会根据不同的LINQ Provider将Lambda表达式转换成不同的内容来执行.对于LINQ to Object.将转换成委托方法.而LINQ to SQL则是转换成表达式数.在数据迭代时才会转换成SQL语句执行.所以.若我们是在LINQ2SQL或ADO.Net EF中如此重构.编译期通过了.但运行时将出错.因为无法将你的自定义方法转换成相关的SQL语句.,因此.将抛出一个异常.

难道,Lambda表达式就只能重复再重复了吗?当然不是.在这里.延迟执行很好的将其作用发挥得淋漓精致.前面说过.延迟执行保存的并不是值,而是获取值的方法或者步骤.这样,每次我们调用完"获取"数据的方法.实际上.数据还没获得.得到的.只是一系列的"步骤".我们可以在步骤的的基础上再添加步骤.这样.就***的实现了Lambda下的重构.

  1. public static IQueryable<Employee> LowPaidSalaried(this IQueryable<Employee> sequence)  
  2.         {  
  3.   return from s in sequence  
  4.  where s.Classification == 1 && s.MonthlySalary < 4000  
  5.                    select s;  
  6.         }var allEmployees = FindAllEmployees();  
  7. var salaried = allEmployees.LowPaidSalaried(); 

这样.只有在需要数据的时候,才会根据"步骤"得到相应的数据.对于IEnumerable<T>,我们可以使用yield return来返回序列.

在复杂的查询中服用Lambda表达式最有效的办法就是封装封闭泛型类型的查询创建扩展方法.通过包含Lambda表达式的小方法叠加"步骤".从而达到最有效的优化.

原文链接:http://www.cnblogs.com/kongyiyun/archive/2010/10/19/1855274.html

【编辑推荐】

 

  1. C# Lambda表达式树浅谈
  2. 理解C#中的Lambda表达式
  3. 浅谈如何使用Lambda表达式做抽象代表
  4. Lambda表达式入门实例
  5. C#窗体位置与大小设置详解
责任编辑:彭凡 来源: 博客园
相关推荐

2009-07-09 09:51:07

Lambda表达式C#

2024-03-25 13:46:12

C#Lambda编程

2009-08-27 09:44:59

C# Lambda表达

2009-08-26 16:17:23

C# Lambda表达

2009-08-27 09:57:50

C# Lambda表达

2021-08-31 07:19:41

Lambda表达式C#

2009-09-14 13:57:20

C# Lambda表达Lambda表达式

2011-05-20 17:50:45

C#

2022-11-07 07:11:19

C#lambda函数

2010-09-14 14:05:42

C#委托

2022-09-19 14:12:27

C++Lambda表达式

2009-07-01 09:56:10

C#3.0

2022-01-14 07:56:39

C#动态查询

2023-03-23 18:40:18

Lambda编程C++

2020-10-16 06:40:25

C++匿名函数

2011-07-06 11:04:42

C#正则表达式

2011-04-25 08:44:34

C#正则表达式

2009-08-07 15:41:39

C#正规表达式

2023-11-02 08:25:58

C++Lambda

2009-09-15 15:18:00

Linq Lambda
点赞
收藏

51CTO技术栈公众号