程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 細說針對C#中的Lambda表達式優化

細說針對C#中的Lambda表達式優化

編輯:關於C語言

使用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.         } 

這樣,每次我們調用的時候,將大大減少代碼量,提高可復用性.

  1. var earlyFolks = from e in allEmployee  
  2.     where LowPaidSalarIEd(e, 4000) && e.YearsOfService > 20  
  3.     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表達式的小方法疊加"步驟".從而達到最有效的優化.

原文鏈接:http://www.cnblogs.com/kongyiyun/archive/2010/10/19/1855274.Html

【編輯推薦】

  1. C# Lambda表達式樹淺談
  2. 理解C#中的Lambda表達式
  3. 淺談如何使用Lambda表達式做抽象代表
  4. Lambda表達式入門實例
  5. C#窗體位置與大小設置詳解
【責任編輯:彭凡 TEL:(010)68476606】
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved