日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
.NETLambda表達(dá)式的語(yǔ)義:字符串列表范例

.NET Lambda表達(dá)式的“語(yǔ)義”

創(chuàng)新新互聯(lián),憑借十余年的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有成百上千家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)

Lambda表達(dá)式的增強(qiáng)在于“語(yǔ)義”二字?!罢Z(yǔ)義”是指代碼所表現(xiàn)出來(lái)的含義,說(shuō)的更通俗一些,便是指一段代碼給閱讀者的“感覺(jué)”如何。為了說(shuō)明這個(gè)例子,我們還是使用示例來(lái)說(shuō)明問(wèn)題。

這個(gè)例子是這樣的:“請(qǐng)寫(xiě)一個(gè)方法,輸入一個(gè)表示整型的字符串列表,并返回一個(gè)列表,包含其中偶數(shù)的平方,并且需要按照平方后的結(jié)果排序”。很簡(jiǎn)單,不是嗎?相信您一定可以一蹴而就:

 
 
 
  1. static List< int> GetSquaresOfPositive(List< string> strList)  
  2. {  
  3.     List< int> intList = new List< int>();  
  4.     foreach (var s in strList) intList.Add(Int32.Parse(s));  
  5.  
  6.     List< int> evenList = new List< int>();  
  7.     foreach (int i in intList)  
  8.     {  
  9.         if (i % 2 == 0) evenList.Add(i);  
  10.     }  
  11.  
  12.     List< int> squareList = new List< int>();  
  13.     foreach (int i in evenList) squareList.Add(i * i);  
  14.  
  15.     squareList.Sort();  
  16.     return squareList;  
  17. }  
  18.  

我想問(wèn)一下,這段代碼給您的感覺(jué)是什么?它給我的感覺(jué)是:做了很多事情。有哪些呢?
1. 新建一個(gè)整數(shù)列表intList,把參數(shù)strList中所有元素轉(zhuǎn)化為整型保存起來(lái)。
2. 新建一個(gè)整數(shù)列表evenList,把intList中的偶數(shù)保存起來(lái)。
3. 新建一個(gè)整數(shù)列表squareList,把evenList中所有數(shù)字的平方保存起來(lái)。
4. 將squareList排序。
5. 返回squareList。

您可能會(huì)問(wèn):“當(dāng)然如此,還能怎么樣?”。事實(shí)上,如果使用了Lambda表達(dá)式,代碼就簡(jiǎn)單多了:

.NET Lambda表達(dá)式的語(yǔ)義:寫(xiě)法范例

 
 
 
  1. static List< int> GetSquaresOfPositiveByLambda(List< string> strList)  
  2. {  
  3.     return strList  
  4.         .Select(s => Int32.Parse(s)) // 轉(zhuǎn)成整數(shù)  
  5.         .Where(i => i % 2 == 0) // 找出所有偶數(shù)  
  6.         .Select(i => i * i) // 算出每個(gè)數(shù)的平方  
  7.         .OrderBy(i => i) // 按照元素自身排序  
  8.         .ToList(); // 構(gòu)造一個(gè)List  
  9. }  

配合.NET 3.5中定義的擴(kuò)展方法,這段代碼可謂“一氣呵成”(在實(shí)際編碼過(guò)程中,老趙更傾向于把這種簡(jiǎn)短的“遞進(jìn)式”代碼寫(xiě)作一行)。那么這行代碼的“語(yǔ)義”又有什么變化呢?在這里,“語(yǔ)義”的變化在于代碼的關(guān)注點(diǎn)從“怎么做”變成了“做什么”。這就是Lambda表達(dá)式的優(yōu)勢(shì)。

在第一個(gè)方法中,我們構(gòu)造了多個(gè)容器,然后做一些轉(zhuǎn)化,過(guò)濾,并且向容器填充內(nèi)容。其實(shí)這些都是“怎么做”,也就是所謂的“how (to do)”。但是這些代碼并不能直接表示我們想要做的事情,我們想要做的事情其實(shí)是“得到XXX”,“篩選出YYY”,而不是“創(chuàng)建容器”,“添加元素”等操作。

在使用Lambda表達(dá)式的實(shí)現(xiàn)中,代碼變得“聲明式(declarative)”了許多。所謂“聲明式”,便是“聲稱代碼在做什么”,而不像“命令式(imperative)”的代碼在“操作代碼怎么做”。換句話說(shuō),“聲明式”關(guān)注的是“做什么”,是指“what (to do)”。上面這段聲明式的代碼,其語(yǔ)義則變成了:
1. 把字符串轉(zhuǎn)化為整數(shù)
2. 篩選出所有偶數(shù)
3. 把每個(gè)偶數(shù)平方一下
4. 按照平方結(jié)果自身排序
5. 生成一個(gè)列表

至于其中具體是怎么實(shí)現(xiàn)的,有沒(méi)有構(gòu)造新的容器,又是怎么向容器里添加元素的……這些細(xì)節(jié),使用Lambda表達(dá)式的代碼一概不會(huì)關(guān)心——這又不是我們想要做的事情,為什么要關(guān)心它呢?

雖然擴(kuò)展方法功不可沒(méi),但我認(rèn)為,Lambda表達(dá)式在這里的重要程度尤勝前者,因?yàn)樗?fù)責(zé)了最關(guān)鍵的“語(yǔ)義”。試想,“i => i * i”給您的感覺(jué)是什么呢?是構(gòu)造了一個(gè)委托嗎(當(dāng)然,您一定知道在這里其實(shí)構(gòu)造了一個(gè)匿名方法)?至少對(duì)我來(lái)說(shuō),它的含義是“把i變成i * i”;同樣,“i => i % 2 == 0”給我的感覺(jué)是“(篩選標(biāo)準(zhǔn)為)i模2等于零”,而不是“構(gòu)造一個(gè)委托,XXX時(shí)返回true,否則返回false”;更有趣的是,OrderBy(i => i)給我的感覺(jué)是“把i按照i自身排序”,而不是“一個(gè)返回i自身的委托”。這一切,都是在“聲明”這段代碼在“做什么”,而不是“怎么做”。

沒(méi)錯(cuò),“類型推演”,“省略括號(hào)”和“省略return關(guān)鍵字”可能的確都是些“細(xì)斜的功能,但也正是這些細(xì)微之處帶來(lái)了編碼方式上的關(guān)鍵性改變。

以上就通過(guò)一個(gè)字符串列表的范例,介紹了.NET Lambda表達(dá)式的語(yǔ)義特征。


網(wǎng)站題目:.NETLambda表達(dá)式的語(yǔ)義:字符串列表范例
當(dāng)前URL:http://www.dlmjj.cn/article/djgscsd.html