C# 2.0最大的改進是泛型.C# 3.0最大的改進就是Linq(Language-integrated Query (LINQ)).Linq又細分三大塊:Linq to XML,Linq to ADO.NET(Linq to SQL,Linq to DataSet,Linq to Entity),Linq to Object.
關於Linq的爭議
有些人對Linq to ADO.NET可能有很多異議.覺得它是對ADO.NET再封裝一次,效能降低了 .而且ADO.NET用著也挺好的.幹嘛那麼麻煩再學個新技術Linq.其實程式設計語言中新增加的一些特性往往是為了更方便開發人員,提高開發效率,降低你犯錯誤的可能性.當然同時得也得考慮效能方面的事了.但是現在電腦硬體設定越來越好.以前的記憶體才那麼幾百M,現在動不動就幾G,CPU效能也越來越好.所以有時別太為電腦去考慮.多為程式員考慮下.怎麼少寫點代碼實現更多的功能.至於那些簡單的代碼後面再要執行啥複雜的操作也不用考慮太多.像Managed 程式碼不就是替你做了很多事,比如不用去考慮啥記憶體泄露這樣的煩心事了嘛.中間多了個CLR效能自然下降了.但你寫起代碼來多省事了啊.
當然了如果你覺得Linq效能不好也可以完全不用,它實現的功能採取其他方法也照樣能實現.只不過多寫些代碼罷了.
簡單例子
先舉幾個關於Linq to Object簡單例子來大概介紹下Linq的文法.看具體怎麼用.
string[] names = { "arwen", "james", "sunny", "lily", "ada" };
var name = from na
in names
select na;
foreach (var str in name)
{
string s = str;
Console.WriteLine(s);
}
分析:
首先說下關鍵字var,它是用來做類型推斷,也就是說它可以用來代替string,int等所有關鍵字來定義一個類型.然後編譯器可編譯時間可以通過變數的值推斷出變數類型.
其實在這裡你也可以用IEnumerable<string> name 來代替var name這樣定義變數.
然後就是from,select這樣的關鍵字了.看起來很像SQL語句的文法吧.Linq的設計應該就是參照了SQL的思想吧.sql語句就是封裝了很多細節,只告訴電腦去做什麼,而不用告訴他具體怎麼做.而我們平時用C#,Jave,C++這些語言都不僅要告訴電腦去做什麼,還要怎麼做.把具體的每一步用代碼寫出來.以上面的例子來說.如果我們要擷取數組中以a開頭的元素.如果沒用Linq你必須這樣寫代碼去判斷
List<string> list = new List<string>();
foreach(string s in names)
{
if(s.StartWith("a")
list.Add(s);
}
就是說要自己指定電腦去具體怎麼做.但如果用Linq的話就直接用下面的語句
var name = from na in names
where na.StartsWith("a")
select na;
用一個where去告訴電腦做什麼就行.具體怎麼做就不用管了.
所以Linq的真正的意義不僅是使你的一些操作更簡單,而且引進了SQL語句那種思想.盡量封裝一些具體操作細節,把注意力放在軟體要實現的功能方面.當然SQL語句應用範圍也是有限,只能針對錶的一些簡單操作,更複雜的操作還需要一些擴充,比如SQL Server有T-SQL,Oracle有PL/SQL,面對一些複雜的操作它們還得寫很多代碼去告訴電腦具體怎麼做.
Linq也同樣有局限的.查詢語言,顧名思議只能查詢資料.所以我們只能從數組names中擷取資料,而不能通過Linq去修飾裡面的資料.
Linq很多用法跟SQL類似,所以可以參照SQL那些關鍵字用法學下.當然Linq還有其他一些更複雜的操作.再舉個簡單例子說下把獲得的資料排序
string[] names = { "arwen", "james", "sunny", "lily", "ada" };
var name = from na in names
orderby na descending
select na;