System.LINQ程序集介紹
LINQ有很多值得學(xué)習(xí)的地方,這里我們主要介紹LINQ的一些強(qiáng)大功能,包括介紹System.LINQ程序集等方面。
LINQ,即Language Integrated Query。很多人熟悉SQL語(yǔ)言,用它來操作數(shù)據(jù)庫(kù)非常方便?,F(xiàn)在在C#3.0中也可以使用相同的語(yǔ)法來操作各種數(shù)據(jù),包括數(shù)組,文件,數(shù)據(jù)庫(kù)等。
下面看一個(gè)例子:
- 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);
- }
- }
是不是對(duì)上面的from,where,orderby等單詞很熟悉,我們可以很輕松的像查詢數(shù)據(jù)庫(kù)一樣查詢某些數(shù)組。其實(shí)上述表達(dá)式等價(jià)于下面這樣的寫法:
- var items=names.Where(name=>name.Length>=6).
OrderBy(name=>name).Select(name=>name.ToUpper());
那么我們?yōu)槭裁茨茉跀?shù)組上應(yīng)用這些方法呢,本來數(shù)組上沒有這些方法啊?回憶一下我們?cè)瓉碚f過的內(nèi)容,擴(kuò)展方法,對(duì),我們?cè)谶@里看到擴(kuò)展方法的用武之地了。而且我們也看到了Lambda表達(dá)式的應(yīng)用使得語(yǔ)句更加簡(jiǎn)潔,易懂。這些擴(kuò)展方法定義在哪里呢?我們可以在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關(guān)鍵字,這些正是擴(kuò)展方法的標(biāo)志。若果我們對(duì)Lambda表達(dá)式不是很熟悉的化,上面的LINQ語(yǔ)句還可以進(jìn)一步轉(zhuǎn)化成委托的形式。
- 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);
有一個(gè)問題,我們會(huì)注意到items前面是用var做它的類型,那么有沒有提出這樣的疑問,這個(gè)var到底是什么類型呢?我們仔細(xì)看一下那個(gè)System.LINQ程序集,就會(huì)發(fā)現(xiàn)擴(kuò)轉(zhuǎn)方法返回的是IEnumerable
這一次只是簡(jiǎn)單的介紹一下LINQ,以后我們?cè)诰唧w的講一些應(yīng)用,不過從介紹中我們看到LINQ的一些強(qiáng)大功能。
【編輯推薦】