亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:10:47
字體:
來源:轉載
供稿:網友

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

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

Compay類

    public class Company    {        public int ComparyId { get; set; }        public string Name { get; set; }    }

Person類

    public class Person    {        public int PersonId { get; set; }        public string Name { get; set; }        public int CompanyId { get; set; }    }

簡單初始化數據

            List<Company> companyList = new List<Company>() {                 new Company(){ComparyId=1, Name="MicroSoft"},                new Company(){ComparyId=2, Name="SamSung"}            };            List<Person> personList = new List<Person>() {                new Person(){ PersonId=1,Name="aehyok",CompanyId=1},                new Person(){ PersonId=2,Name="aehyok",CompanyId=2},                new Person(){ PersonId=3,Name="aehyok",CompanyId=1},                new Person(){ PersonId=4,Name="aehyok",CompanyId=2},            };

下面來看最重要的部分

            var personWithCompany = from person in personList                                    join company in companyList                                     on person.CompanyId equals company.ComparyId                                    select new { PersonName = person.Name, CompanyName = company.Name };

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

            foreach(var item in personWithCompany)            {                Console.WriteLine(string.Format("{0}/t:{1}", item.PersonName, item.CompanyName));            }            Console.ReadLine();

調用結果如下所示

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

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

修改之前

            var personWithCompany = from person in personList                                    join company in companyList                                     on person.CompanyId equals company.ComparyId                                    select new { PersonName = person.Name, CompanyName = company.Name };

修改之后

            var personWithCompany = from person in personList                                    select new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicroSoft" : "SamSung" };

當然還有另外一種方式

var personWithCompany = personList.Select(person => new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicorSoft" : "SamSung" });

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

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

            var personWithCompany = personList.Select(person => new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicorSoft" : "SamSung" });            foreach (var item in personWithCompany.Where(pItem => pItem.CompanyName == "SamSung"))            {                Console.WriteLine(item.PersonName);            }

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

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

        static void Main(string[] args)        {            List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };            var temp1 = from c in list where c > 5 select c;            var temp2 = (from c in list where c > 5 select c).ToList<int>();            list[0] = 11;            Console.Write("temp1:");            foreach (var item in temp1)            {                Console.Write(item.ToString());            }            Console.Write("/ntemp2:");            foreach (var item in temp2)            {                Console.Write(item.ToString());            }            Console.ReadLine();        }

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

在延遲求值的情況下,只是定義了一個查詢,而且不是立刻執行。對查詢結果的訪問每次都會遍歷原集合。如上文中對于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’m just passing through.——我只是過境而已。

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

作者:aehyok

出處:http://www.49028c.com/aehyok/

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲片av在线| 亚洲精品www久久久| 日韩亚洲成人av在线| 26uuu久久噜噜噜噜| 欧美日韩国产色视频| 九九久久国产精品| 亚洲成avwww人| 美日韩精品免费视频| 欧美日韩中文字幕在线视频| 欧美性极品xxxx娇小| 日韩视频在线免费观看| 亚洲免费高清视频| 亚洲天堂av综合网| 亚洲黄页视频免费观看| 国产z一区二区三区| 久久视频在线免费观看| 亚洲va久久久噜噜噜| 中文字幕av一区中文字幕天堂| 久久久成人精品视频| 日韩精品久久久久久久玫瑰园| 亚洲人a成www在线影院| 国产精品中文字幕在线观看| 91地址最新发布| 国产精品入口免费视频一| 欧美精品少妇videofree| 久久精品影视伊人网| 久久国产视频网站| 国产精品欧美在线| 国产国语videosex另类| 欧美性极品xxxx做受| 中文字幕精品网| 97国产在线视频| 日韩欧美aⅴ综合网站发布| 国产91免费看片| 日韩三级影视基地| 韩国精品美女www爽爽爽视频| 亚洲奶大毛多的老太婆| 77777少妇光屁股久久一区| 国产精品亚洲视频在线观看| 欧美午夜精品久久久久久浪潮| 国产在线日韩在线| 日韩精品高清在线| 91热福利电影| 日韩美女主播视频| 九九热这里只有在线精品视| 日韩精品在线观| 国产亚洲在线播放| 日韩精品免费综合视频在线播放| 超碰97人人做人人爱少妇| 亚洲男人天堂视频| 亚洲国产精彩中文乱码av| 久久久国产精彩视频美女艺术照福利| 91亚洲国产成人久久精品网站| 欧美成人免费全部| 欧美日本中文字幕| 欧美性jizz18性欧美| 91精品国产综合久久香蕉的用户体验| 亚洲第一福利在线观看| 日韩激情视频在线播放| 久久久亚洲网站| 超碰精品一区二区三区乱码| 国产精品99久久久久久白浆小说| 精品在线观看国产| 91久久久久久久久久| 国产日产久久高清欧美一区| 日本欧美中文字幕| 国产精品91视频| www.99久久热国产日韩欧美.com| 国产在线观看91精品一区| 91超碰caoporn97人人| 亚洲欧美日韩精品久久亚洲区| 欧美日韩久久久久| 国产成人精品视频在线| 日韩小视频在线| 国产精品一区二区电影| 国产美女精彩久久| 欧美激情在线播放| 亚洲福利视频免费观看| 国色天香2019中文字幕在线观看| 久久久人成影片一区二区三区| 久久精品国产免费观看| 国产精品香蕉国产| 国产亚洲欧洲高清| 国产精品aaaa| 亚洲黄页网在线观看| 久久久久久久一区二区三区| 欧美在线观看视频| 国产伦精品一区二区三区精品视频| 色99之美女主播在线视频| 色狠狠久久aa北条麻妃| 色悠悠久久88| 视频直播国产精品| 91国内免费在线视频| 国产成人aa精品一区在线播放| 国内免费精品永久在线视频| 亚洲一区二区三区香蕉| 国产精品欧美久久久| 成人免费直播live| 欧美极品少妇全裸体| 久久久极品av| 社区色欧美激情 | 97视频在线免费观看| 国产精品情侣自拍| 国产精品jvid在线观看蜜臀| 国产精品免费久久久久久| 成人免费网站在线| 成人a级免费视频| 国产亚洲美女久久| 精品久久久久久久中文字幕| 少妇高潮久久77777| 日韩欧美国产高清91| 国内免费精品永久在线视频| 成人亚洲综合色就1024| 55夜色66夜色国产精品视频| 日韩欧美亚洲一二三区| 国产精品第七影院| 亚洲国产日韩精品在线| 亚洲精品成人免费| 欧美日韩一区二区在线| 久久手机精品视频| 一本色道久久综合狠狠躁篇怎么玩| 97精品视频在线播放| 国产精品日韩专区| 欧美日韩福利电影| 久久久久久久久久国产精品| 91高潮精品免费porn| 欧美性极品xxxx娇小| 色妞在线综合亚洲欧美| 成人美女av在线直播| 人人澡人人澡人人看欧美| 国产自摸综合网| 国产日韩av高清| 性欧美亚洲xxxx乳在线观看| 中日韩美女免费视频网站在线观看| 亚洲福利在线观看| 粗暴蹂躏中文一区二区三区| 在线观看久久av| 色午夜这里只有精品| 欧美日韩成人在线播放| 国产精品久久久久久久久久久久| 97国产suv精品一区二区62| 欧美日韩国产精品专区| 成人激情av在线| 91香蕉嫩草神马影院在线观看| 亚洲国产古装精品网站| 欧美一级电影久久| 91精品视频大全| 欧美怡春院一区二区三区| 亚洲第一精品夜夜躁人人躁| 欧美成人免费全部观看天天性色| 欧美性受xxxx黑人猛交| 欧美成人精品三级在线观看| 亚洲色图狂野欧美| 夜夜躁日日躁狠狠久久88av| 92裸体在线视频网站| 久久大大胆人体| 国产精品成人va在线观看| 国产大片精品免费永久看nba| 精品一区二区三区四区| 精品一区二区三区电影| 亚洲欧美日韩精品久久奇米色影视| 综合av色偷偷网| 91热福利电影| 欧美大片网站在线观看|