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

  • 相关阅读:
    jquery 实现 html5 placeholder 兼容password密码框
    php返回json的结果
    使用PHP读取远程文件
    Sharepoint 自定义字段
    Sharepoint 中新增 aspx页面,并在页面中新增web part
    【转】Sharepoint 2010 配置我的站点及BLOG
    JS 实现 Div 向上浮动
    UserProfile同步配置
    【转】Import User Profile Photos from Active Directory into SharePoint 2010
    Sharepoint 2010 SP1升级后 FIMSynchronizationService 服务无法开启
  • 原文地址:https://www.cnblogs.com/Unrmk-LingXing/p/4154016.html
Copyright © 2020-2023  润新知