前言
從.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。
新聞熱點
疑難解答