【More Effective C#】Lambda表达式优化

2010-10-19 08:09 by 空逸云, 2923 阅读, 38 评论, 收藏, 编辑

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

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

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

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

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

var earlyFolks = from e in allEmployeewhere LowPaidSalaried(e, 4000) && e.YearsOfService > 20select 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 sequencewhere s.Classification == 1 && s.MonthlySalary < 4000select s;}
var allEmployees = FindAllEmployees();var salaried = allEmployees.LowPaidSalaried();

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

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

作者:空逸云
出处:http://kongyiyun.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/ppcompany/articles/2701952.html

【More Effective C#】Lambda表达式优化相关推荐

  1. lambda表达式优化反射_反射选择器表达式

    lambda表达式优化反射 Java :: Geci是一个在单元测试期间运行的代码生成器. 如果生成的代码适合源代码的实际版本,则测试不会失败. 如果需要进行任何修改,则测试将修改源代码并失败. 例如 ...

  2. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  3. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  4. 简化业务代码开发:看Lambda表达式如何将代码封装为数据

    摘要:在云服务业务开发中,善于使用代码新特性,往往能让开发效率大大提升,这里简单介绍下lambad表达式及函数式接口特性. 1.Lambda 表达式 Lambda表达式也被称为箭头函数.匿名函数.闭包 ...

  5. lambda表达式最全总结

    lambda表达式 一.lambda表达式的引入 为什么引入lambda表达式 需求环境:线程类的创建 解决方案:匿名内部类实现 解决方案PLUS:lambda表达式实现 代码: package co ...

  6. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

  7. JDK8_新特性_详细总结+代码(1)Lambda表达式

    Java 是第一大编程语言和开发平台.它有助于企业降低成本.缩短开发周期.推动创新以及改善应用服务.如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选 ...

  8. Lambda表达式语法及应用

    前言: JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提 ...

  9. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

最新文章

  1. 如何修改 远程桌面的 默认端口号 3389
  2. C#对Excel的样式操作
  3. 一行代码快速搞定Flowable断点下载(上)
  4. hdu1353 小暴力
  5. 1349. 修理牛棚【难度: 中 / 思维 贪心】
  6. s3c6410 jpeg编码 linux,S3C6410 裸机硬件JPEG解码
  7. 测试必备:if条件测试( if-else语句、if-elif-else语句、多个elif代码块、省略else代码块、测试多个条件)
  8. Atitit 跨平台的系统截图解决方案
  9. 编译原理c语言递归下降程序,编译原理(递归下降分析程序)
  10. socket程序退出后端口依然被占用问题的解决
  11. 基于stm32/单片机/DSP/Java的毕业设计 课程设计
  12. 不知道视频怎样提取音频?这里有详细教程分享
  13. 部署-GPS授时系统:GPS授时系统
  14. 简要概述《网络安全法》与“等保”的关系
  15. 项目实战!用爬虫和Flask打造属于自己的电影网站
  16. Solaris 10 Configure IPMP
  17. 2011-07 《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  18. htc Vive中VR界面闪烁的解决
  19. Android制作的一个通讯录
  20. OS属不属于计算机硬件系统,os系统是什么意思 os系统是属于哪个系统

热门文章

  1. 多线程编程之二——MFC中的多线程开发
  2. Windows下C/C++获取当前系统时间
  3. keil查看程序运行时间_Keil系列教程05_工程目标选项配置(一)
  4. C++ 标准库类型 set
  5. 范式青春er,寻找同行的你!
  6. 数据科学中的Docker
  7. python3的3D开发-基于blender(1)
  8. 【数据竞赛】数据竞赛中最贵的四个特征
  9. 【Python基础】101道Numpy、Pandas练习题,提升你的Python水平
  10. 【NLP】创建强大聊天机器人的初学者指南