程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 編寫高質量代碼改善C#程序的157個建議[匿名類型、Lambda、延遲求值和主動求值]

編寫高質量代碼改善C#程序的157個建議[匿名類型、Lambda、延遲求值和主動求值]

編輯:C#入門知識

  從.NET3.0開始,C#開始一直支持一個新特性:匿名類型。匿名類型由var、賦值運算符和一個非空初始值(或以new開頭的初始化項)組成。匿名類型有如下基本特性:

1、既支持簡單類型也支持復雜類型。簡單類型必須是一個非空初始值,復雜類型則是一個以new開頭的初始化項。

2、匿名類型的屬性是只讀的,沒有屬性設置器,它一旦倍初始化就不可更改。

3、如果兩個匿名類型的屬性值相同,那麼就任務這兩個匿名類型相等。

4、匿名類型可以在循環中用作初始化器。

5、匿名類型支持智能感知。

6、匿名類型也可以擁有方法。  

本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要學習記錄以下內容:

  建議26、使用匿名類型儲存LINQ查詢結果

  建議27、在查詢中使用Lambda表達式

  建議28、理解延遲求值和主動求值之間的區別

  我們直接來看一個簡單的實例吧,假如現在有一個公司Company的實體類,然後又有一個人員的Person類,現在需要將Person類中的Name和Company類中的Name進行關聯,而形成一個新的類型。

Compay類

       ComparyId { ;   Name { ; 

Person類

       PersonId { ;   Name { ;   CompanyId { ; 

簡單初始化數據

            List<Company> companyList =  List<Company> Company(){ComparyId=, Name= Company(){ComparyId=, Name=<Person> personList =  List<Person> Person(){ PersonId=,Name=,CompanyId= Person(){ PersonId=,Name=,CompanyId= Person(){ PersonId=,Name=,CompanyId= Person(){ PersonId=,Name=,CompanyId=

下面來看最重要的部分

             personWithCompany =  person   { PersonName = person.Name, CompanyName = company.Name };

其中new之前的代碼是Linq關鍵字,new之後的代碼就是匿名類型的初始化項。該匿名類型包含兩個屬性:PersonName和CompanyName。

            ( item .Format(

調用結果如下所示

 Linq實際上是基於擴展方法和lambda表達式的,理解了這一點就不難理解Linq。任何Linq查詢都能通過調用擴展方法的方式來替代。下面我們將建議26中的查詢語句進行修改

修改之前

             personWithCompany =  person   { PersonName = person.Name, CompanyName = company.Name };

修改之後

             personWithCompany =  person   { PersonName = person.Name, CompanyName = person.CompanyId ==  ?  :  };

當然還有另外一種方式

 personWithCompany = personList.Select(person =>  { PersonName = person.Name, CompanyName = person.CompanyId ==  ?  :  });

針對LINQ設計的擴展方法大多應用了泛型委托。System命名空間定義了泛型委托Action、Func、Predicate。可以這樣理解這三個委托:Action用於執行一個操作,所以它沒有返回值,Func用於執行一個操作並返回一個值,Predicate用於定義一組條件並判斷參數是否符合條件。Select擴展方法接受的就是一個Func委托,而Lambda表達式其實就是一個簡介的委托,運算符“=>”左邊代表的是方法的參數,右邊的是方法體。

下面我們再來舉個簡單的小例子,調用Where擴展方法,查找出“SamSung”公司的員工

             personWithCompany = personList.Select(person =>  { PersonName = person.Name, CompanyName = person.CompanyId ==  ?  :  ( item  personWithCompany.Where(pItem => pItem.CompanyName == 

 我們先繼續看一個簡單的小例子:

          Main(<> list =  List<>() { , , , , , , , , ,  temp1 =  c  list  c >   temp2 = ( c  list  c >   c).ToList<>] =  ( item  ( item 

這代碼很簡單,看執行結果

在延遲求值的情況下,只是定義了一個查詢,而且不是立刻執行。對查詢結果的訪問每次都會遍歷原集合。如上文中對於temp1的迭代,在迭代之前,我們修改了list[0]的值,可以看到,修改直接影響了迭代的輸出。對查詢調用ToList、ToArray等方法,將會使其立即執行,由於對list[0]的修改是在temp2查詢之後進行的,所以針對list[0]的修改不會影響到temp2的結果。

在使用Linq to SQL時,延遲求值能夠帶來顯著的性能提升。舉個例子:如果定義了兩個查詢:而且采用延遲求值,CLR會合並兩次查詢並生成一個最終的查詢。

英語小貼士

1、Mineral water——礦泉水      beer——啤酒

2、May I see your passport, please?——我能看一下你的護照嗎?  Here is my passport / Here it is.——這是我的護照。

3、What‘s the purpose of your visit?——旅行目的為何? Sightseeing(Businese).——觀光(公務)

4、Do you have a return ticket to Taiwan?——是否有台灣回程機票?  Yes, here it is.——這是我的回程機票

5、How long will you be staying in the United States?——5 days.

6、How much money do you have with you?——你隨身攜帶多少現金?  I have 800 dollars.——大約800元

7、Where are you staying?——將在那兒住宿? I will stay at Boston Hotel.——我將住在波士頓飯店。

8、

I am leaving for Geneva tonight.——今晚即動身前往日內瓦。

作者:aehyok

出處:http://www.cnblogs.com/aehyok/

感謝您的閱讀,如果您對我的博客所講述的內容有興趣,那不妨點個推薦吧,謝謝支持:-O。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved