日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
細說針對C#中的Lambda表達式優(yōu)化

使用Lambda表達式將會造成Lambda表達式主題部分的代碼重復.

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗的網(wǎng)站設(shè)計師、開發(fā)人員和項目經(jīng)理組成的專業(yè)建站團隊,負責網(wǎng)站視覺設(shè)計、用戶體驗優(yōu)化、交互設(shè)計和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、成都網(wǎng)站設(shè)計、成都網(wǎng)站制作易于使用并且具有良好的響應性。

 
 
 
  1. var allEmployees = new List() { 
  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; 

若每當我們要獲取一次不同工薪階層的數(shù)據(jù).就要重復一次.相信久經(jīng)"高重用,松耦合"定律的你.肯定會想盡辦法將其實現(xiàn)高重用,松耦合.在以前方法調(diào)用的時代.可能你會將其提煉出

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

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

 
 
 
  1. var earlyFolks = from e in allEmployee  
  2.     where LowPaidSalaried(e, 4000) && e.YearsOfService > 20  
  3.     select e; 

然而,很不幸的是.在這里.這種重構(gòu)的方式反倒降低了其可重用性.實際上,***種方法的可重用性比第二種方法更高些.為什么呢?明明已經(jīng)提煉出重用方法了.這與Lambda表達式的求值,解析以及最終的執(zhí)行方式有關(guān).

前面的<>里說過.編譯器會根據(jù)不同的LINQ Provider將Lambda表達式轉(zhuǎn)換成不同的內(nèi)容來執(zhí)行.對于LINQ to Object.將轉(zhuǎn)換成委托方法.而LINQ to SQL則是轉(zhuǎn)換成表達式數(shù).在數(shù)據(jù)迭代時才會轉(zhuǎn)換成SQL語句執(zhí)行.所以.若我們是在LINQ2SQL或ADO.Net EF中如此重構(gòu).編譯期通過了.但運行時將出錯.因為無法將你的自定義方法轉(zhuǎn)換成相關(guān)的SQL語句.,因此.將拋出一個異常.

難道,Lambda表達式就只能重復再重復了嗎?當然不是.在這里.延遲執(zhí)行很好的將其作用發(fā)揮得淋漓精致.前面說過.延遲執(zhí)行保存的并不是值,而是獲取值的方法或者步驟.這樣,每次我們調(diào)用完"獲取"數(shù)據(jù)的方法.實際上.數(shù)據(jù)還沒獲得.得到的.只是一系列的"步驟".我們可以在步驟的的基礎(chǔ)上再添加步驟.這樣.就***的實現(xiàn)了Lambda下的重構(gòu).

 
 
 
  1. public static IQueryable LowPaidSalaried(this IQueryable 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(); 

這樣.只有在需要數(shù)據(jù)的時候,才會根據(jù)"步驟"得到相應的數(shù)據(jù).對于IEnumerable,我們可以使用yield return來返回序列.

在復雜的查詢中服用Lambda表達式最有效的辦法就是封裝封閉泛型類型的查詢創(chuàng)建擴展方法.通過包含Lambda表達式的小方法疊加"步驟".從而達到最有效的優(yōu)化.


分享標題:細說針對C#中的Lambda表達式優(yōu)化
網(wǎng)頁地址:http://www.5511xx.com/article/cojisoe.html