zoukankan      html  css  js  c++  java
  • 一起谈.NET技术,【More Effective C#】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. }

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

    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下的重构.

    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表达式的小方法叠加"步骤".从而达到最有效的优化.

  • 相关阅读:
    TrendMicro PcCillin 2005卸载密码忘记。
    解决Exchange OWA用户登陆后有的用户文件夹显示中文有的显示英文。
    注册表解锁
    修改Linux Fedora Grup的默认启动系统.
    OfficeXP升级到SP3后outlook出现的恼人的提示。
    在 Outlook 中单击超链接时收到错误信息
    windows sbs 2003的功能限制和其他用法
    今天打了加强型乙肝疫苗。
    WSUS服务器的详细配置和部署转载
    当邮箱存储数据库达到 16 GB 限制时,Exchange Server 2003 邮箱存储无法装入
  • 原文地址:https://www.cnblogs.com/waw/p/2162740.html
Copyright © 2011-2022 走看看