轉:【More Effective C#】Lambda運算式最佳化

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   color   os   使用   sp   

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運算式最佳化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.