System.LINQ程序集介紹
LINQ有很多值得學習的地方,這里我們主要介紹LINQ的一些強大功能,包括介紹System.LINQ程序集等方面。
LINQ,即Language Integrated Query。很多人熟悉SQL語言,用它來操作數據庫非常方便。現在在C#3.0中也可以使用相同的語法來操作各種數據,包括數組,文件,數據庫等。
下面看一個例子:
- class Program
- ...{
- static void Main(string[] args)
- ...{
- string[] names=...{"Everett", "Albert", "George", "Harris", "David" };
- var items=from name in names
- where name.Length>=6
- orderby name
- select name.ToUpper();
- foreach(var item in items)
- Console.WriteLine(item);
- }
- }
是不是對上面的from,where,orderby等單詞很熟悉,我們可以很輕松的像查詢數據庫一樣查詢某些數組。其實上述表達式等價于下面這樣的寫法:
- var items=names.Where(name=>name.Length>=6).
OrderBy(name=>name).Select(name=>name.ToUpper());
那么我們為什么能在數組上應用這些方法呢,本來數組上沒有這些方法啊?回憶一下我們原來說過的內容,擴展方法,對,我們在這里看到擴展方法的用武之地了。而且我們也看到了Lambda表達式的應用使得語句更加簡潔,易懂。這些擴展方法定義在哪里呢?我們可以在System.LINQ程序集里面看到這樣的定義:
- namespace System.LINQ ...{
- public static class Enumerable ...{
- public static IEnumerable<T> Where<T>(
- this IEnumerable<T> source, Func<T, bool> predicate) ...{
- foreach (T item in source)
- if (predicate(item)
- )
- yield return item;
- }
- }
- }
這里我們可以清晰的看到許多this關鍵字,這些正是擴展方法的標志。若果我們對Lambda表達式不是很熟悉的化,上面的LINQ語句還可以進一步轉化成委托的形式。
- Func<string, bool> filter = delegate (string s) ...{return s.Length >=6;};
- Func<string, string> extract = delegate (string s) ...{return s; };
- Func<string, string> project = delegate (string s) ...{return s.ToUpper(); };
- var items = names.Where(filter) .OrderBy(extract) .Select(project);
有一個問題,我們會注意到items前面是用var做它的類型,那么有沒有提出這樣的疑問,這個var到底是什么類型呢?我們仔細看一下那個System.LINQ程序集,就會發現擴轉方法返回的是IEnumerable
這一次只是簡單的介紹一下LINQ,以后我們在具體的講一些應用,不過從介紹中我們看到LINQ的一些強大功能。
【編輯推薦】