自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

細(xì)說針對(duì)C#中的Lambda表達(dá)式優(yōu)化

開發(fā) 后端
對(duì)于Lambda表達(dá)式主題代碼的重復(fù)問題,本文將給出一個(gè)優(yōu)化解決方案,希望對(duì)大家有所幫助。

使用Lambda表達(dá)式將會(huì)造成Lambda表達(dá)式主題部分的代碼重復(fù).

  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; 

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

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

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

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

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

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

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

  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(); 

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

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

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

【編輯推薦】

 

  1. C# Lambda表達(dá)式樹淺談
  2. 理解C#中的Lambda表達(dá)式
  3. 淺談如何使用Lambda表達(dá)式做抽象代表
  4. Lambda表達(dá)式入門實(shí)例
  5. C#窗體位置與大小設(shè)置詳解
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-07-09 09:51:07

Lambda表達(dá)式C#

2024-03-25 13:46:12

C#Lambda編程

2009-08-27 09:44:59

C# Lambda表達(dá)

2009-08-26 16:17:23

C# Lambda表達(dá)

2009-08-27 09:57:50

C# Lambda表達(dá)

2021-08-31 07:19:41

Lambda表達(dá)式C#

2009-09-14 13:57:20

C# Lambda表達(dá)Lambda表達(dá)式

2010-09-14 14:05:42

C#委托

2011-05-20 17:50:45

C#

2022-11-07 07:11:19

C#lambda函數(shù)

2009-07-01 09:56:10

C#3.0

2022-09-19 14:12:27

C++Lambda表達(dá)式

2022-01-14 07:56:39

C#動(dòng)態(tài)查詢

2023-03-23 18:40:18

Lambda編程C++

2020-10-16 06:40:25

C++匿名函數(shù)

2011-07-06 11:04:42

C#正則表達(dá)式

2011-04-25 08:44:34

C#正則表達(dá)式

2009-08-07 15:41:39

C#正規(guī)表達(dá)式

2012-06-26 10:03:58

JavaJava 8lambda

2023-11-02 08:25:58

C++Lambda
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)