C# 2.0最大的改進是泛型.C# 3.0最大的改進就是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性能也越來越好.所以有時別太為電腦去考慮.多為程序員考慮下.怎麼少寫點代碼實現更多的功能.至於那些簡單的代碼後面再要執行啥復雜的操作也不用考慮太多.像托管代碼不就是替你做了很多事,比如不用去考慮啥內存洩露這樣的煩心事了嘛.中間多了個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;