转:【More Effective C#】Lambda表达式优化
http://www.cnblogs.com/kongyiyun/archive/2010/10/19/1855274.html
使用Lambda表达式将会造成Lambda表达式主题部分的代码重复.
var allEmployees = new List<Employee>() { new Employee { EmployeeId = 1, Classification = 1, FirstName = "Skin", LastName = "Sen" } }; var earlyFolks = from e in allEmployees where e.MonthlySalary < 4000 && e.Classification == 1 && e.YearsOfService > 20 select e;
若每当我们要获取一次不同工薪阶层的数据.就要重复一次.相信久经"高重用,松耦合"定律的你.肯定会想尽办法将其实现高重用,松耦合.在以前方法调用的时代.可能你会将其提炼出
private static bool LowPaidSalaried(Employee e, int salar)
{
return e.MonthlySalary < salar && e.Classification == 1;
}
这样,每次我们调用的时候,将大大减少代码量,提高可复用性.
var earlyFolks = from e in allEmployee
where LowPaidSalaried(e, 4000) && e.YearsOfService > 20
select e;
然而,很不幸的是.在这里.这种重构的方式反倒降低了其可重用性.实际上,第一种方法的可重用性比第二种方法更高些.为什么呢?明明已经提炼出重用方法了.这与Lambda表达式的求值,解析以及最终的执行方式有关.
前面的<<LINQ表达式与方法调用的映射>>里说过.编译器会根据不同的LINQ Provider将Lambda表达式转换成不同的内容来执行.对于LINQ to Object.将转换成委托方法.而LINQ to SQL则是转换成表达式数.在数据迭代时才会转换成SQL语句执行.所以.若我们是在LINQ2SQL或ADO.Net EF中如此重构.编译期通过了.但运行时将出错.因为无法将你的自定义方法转换成相关的SQL语句.,因此.将抛出一个异常.
难道,Lambda表达式就只能重复再重复了吗?当然不是.在这里.延迟执行很好的将其作用发挥得淋漓精致.前面说过.延迟执行保存的并不是值,而是获取 值的方法或者步骤.这样,每次我们调用完"获取"数据的方法.实际上.数据还没获得.得到的.只是一系列的"步骤".我们可以在步骤的的基础上再添加步 骤.这样.就完美的实现了Lambda下的重构.
public static IQueryable<Employee> LowPaidSalaried(this IQueryable<Employee> sequence)
{
return from s in sequence
where s.Classification == 1 && s.MonthlySalary < 4000
select s;
}
var allEmployees = FindAllEmployees(); var salaried = allEmployees.LowPaidSalaried();
这样.只有在需要数据的时候,才会根据"步骤"得到相应的数据.对于IEnumerable<T>,我们可以使用yield return来返回序列.
在复杂的查询中服用Lambda表达式最有效的办法就是封装封闭泛型类型的查询创建扩展方法.通过包含Lambda表达式的小方法叠加"步骤".从而达到最有效的优化.
转:【More Effective C#】Lambda表达式优化的更多相关文章
- C#匿名函数与Lambda表达式
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.在C#中的Linq中的大部分就是由扩展方法 ...
- Java提升二:Lambda表达式与方法引用
1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...
- Java8 Lambda表达式(一)
目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——43.方法引用优于lambda表达式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 使用 functional interface 和 lambda 表达式来优化代码
========================================原始代码========================================RoleService 类有删除 ...
- [Java 8] (9) Lambda表达式对递归的优化(下) - 使用备忘录模式(Memoization Pattern) .
使用备忘录模式(Memoization Pattern)提高性能 这个模式说白了,就是将需要进行大量计算的结果缓存起来,然后在下次需要的时候直接取得就好了.因此,底层只需要使用一个Map就够了. 但是 ...
- [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...
- jdk8新特性--使用lambda表达式的延迟执行特性优化性能
使用lambda表达式的延迟加载特性对代码进行优化:
随机推荐
- CSS3 Media Queries
Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码: <link href="css/reset.css" rel= ...
- ios基础篇(九)——自定义UITabBar
上一篇讲到了UITabBarViewController,接着说说UITabBarViewController中怎么自定义TabBar. 今天仿写了微博,发现底部tabbar中间的button和其他有 ...
- Sui 弹框固定
SUI是一套基于bootstrap开发的前端组件库,同时它也是一套设计规范,可以非常方便的设计和实现精美的页面,是一个简单易用.功能强大的UI库.自己在使用sui过程之中,总是忘记它的一些Api,今天 ...
- [转]何时使用委托而不使用接口(C# 编程指南)
以下内容转自MSDN:http://msdn.microsoft.com/zh-cn/library/ms173173.aspx 委托和接口都允许类设计器分离类型声明和实现. 任何类或结构都能继承和实 ...
- 执行MAVEN更新包
我们一般使用 mvn eclipse:eclipse 执行对maven库的引用,这样会修改项目下的classpath文件. 我们修改直接在eclipse 使用maven库作为项目的引用. 步骤如下: ...
- AngularJS recursive(递归)
工作中我们经常要遍历多层数据,如果数据是已知层级的话,用 ng-repeat 就搞定了,要是数据深度是无限的呢,或者我们要实现一个无限层级的 tree 的时候,该怎么办? 答案是使用 ng-inclu ...
- 利用dispatch_once创建单例
无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例 ...
- JAVA中StringBuffer类常用方法详解
String是不变类,用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此java提供了一个StringBuffer类,这个类在修改字符串 ...
- 【STL】-deque的用法
初始化: #include <deque> deque<float> fdeque; 算法: fdeque.push_front(f); fdeque.push_back(f) ...
- 关于java.lang.reflect.InvocationTargetException
今天遇到java.lang.reflect.InvocationTargetException错误,卡了好一会儿,报错代码 try { Class<?> c= Class.forName( ...