|
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實(shí)例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
文章發(fā)布后大家有些人叫做,心里竊喜,不過壓力也大增,我很想按照簡潔明快的文風(fēng)寫下去,不過講技術(shù)的文章很難不落于沉悶,所以我努力了。(題外話:這幾天猛看幽默小說,想把文字寫的幽默一點(diǎn),開個玩笑,呵呵)
經(jīng)過幾天的閉關(guān)編程大師又有了一些新的覺悟了,不管對DSL還是命令式編程和函數(shù)式編程都有了新的理解。如是他又接著了漫長的云游。第一站當(dāng)然就是那個曾經(jīng)讓他結(jié)下心結(jié)的那個剛畢業(yè)的coder。
大師:“嘿,這幾日可好,還在發(fā)牢騷么?”
Coder:“不了,正好你來了,讓你看看我的程序”,Coder將他的電腦屏幕轉(zhuǎn)向大師,期盼的眼神表明他急切的期望得到大師的夸獎。
如是大師看到了如下一些代碼:
////// 一個通用的泛型委托,代表接受一個參數(shù)并有一個返回值的方法
///
/// 輸入?yún)?shù)類型
/// 返回值類型
/// 輸入?yún)?shù)
/// 返回值
public delegate TOutput MyDelegate<TInput,TOutput>(TInput input);
///
/// 這個類是包含有對IEnumerable接口的一系列擴(kuò)展方法
/// 因?yàn)樵?NET里所有的集合類都實(shí)現(xiàn)了IEnumerable接口
/// 所以對該接口的擴(kuò)展將擴(kuò)散到所有集合
///
public static class Extension
{
public static IEnumerable<TInput> Where<TInput>(this IEnumerable<TInput> self, MyDelegate<TInput, bool> filter)
{
foreach (TInput item in self)
if (filter(item))
yield return item;
}
public static IEnumerable<TOutput> Select<TInput, TOutput>(this IEnumerable<TInput> self, MyDelegate<TInput, TOutput> selector)
{
foreach(TInput item in self)
yield return selector(item);
}
//下面有更多的SQL風(fēng)格的移植
}
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實(shí)例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
Coder一邊展示著代碼,一邊念叨著,這里是因?yàn)槭褂昧?ldquo;擴(kuò)展方法”所以可以這樣寫,這里使用了Lambda表達(dá)式,它可以簡化匿名方法的寫法,這里......
編程大師一邊聽著coder的講解,一遍頻頻點(diǎn)頭:“傻小子,不錯啊,有點(diǎn)當(dāng)年我的影子,按照你這樣下去羅馬也可以建成了,Linq也是可以寫出來的呀。”
Coder聽到大師的話興奮異常,不過他從這句話里還是捕捉到了一個陌生的詞匯:Linq。他用詫異的眼神看著大師,問道:”啥是Linq,是誰家又創(chuàng)造了個新詞匯?”
大師笑著說,其實(shí)你剛才做的微軟已經(jīng)幫你做了,還給它起了一個非常洋氣的名字:Linq,中文名字呢就叫做 語言集成查詢。
在.NET 3.5發(fā)布的時候,微軟新發(fā)布了幾個dll,其中有一個就叫做System.Core.dll,在這個dll下對一些System命名空間做了進(jìn)一步擴(kuò)展。
在System.Core.dll下的System命名空間下你會發(fā)現(xiàn)有這么幾個泛型的委托:
//無參,有一個返回值public delegate TResult Func<TResult>();
//有一個參數(shù)和一個返回值,和你那個MyDelegate一樣
public delegate TResult Func<T, TResult>(T arg);
//兩個參數(shù)一個返回值
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
//三個參數(shù)一個返回值
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
//四個參數(shù)一個返回值
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實(shí)例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
還沒等coder說出口大師就在鍵盤上敲下:
程序=代碼+數(shù)據(jù)
編程大師如是接著說:那這些數(shù)據(jù)平時都來源于哪里?
Coder:程序中自己構(gòu)造的一些集合對象,像我剛才的代碼中那樣,還有數(shù)據(jù)庫,這個使我們平時用到最多的,還有XML存儲,還有WebService,這個來源于遠(yuǎn)程的數(shù)據(jù),還有什么RSS啦等等,很多了。
編程大師:嗯,是的。數(shù)據(jù)的來源非常廣泛,就說我們平常用的三個吧,內(nèi)存中的集合對象、XML存儲和數(shù)據(jù)庫。對于內(nèi)存中的集合對象我們有語言自身的支持,XML我們有XML的一些API,比如XPath,對于數(shù)據(jù)庫我們有ADO.NET,可實(shí)際上從抽象層面我們對這些數(shù)據(jù)的操作都是相同的,你想不想屏蔽掉存儲的細(xì)節(jié),在高層有一個統(tǒng)一的API訪問這些數(shù)據(jù)呢?至于數(shù)據(jù)存儲在哪里對于你是透明的,也許它存在于你內(nèi)存中,也許在萬網(wǎng)的機(jī)房也許在美國西雅圖,但是對于你來說這些都無需關(guān)心,你的代碼都一樣。
Coder:聽起來是個很美妙的事情,這不會是在做夢吧。
大師:不是在做夢,今天你已經(jīng)有了這些方法
在.NET 3.5里微軟還發(fā)布了另外兩個dll:
System.Data.Linq.dll,System.Xml.Linq.dll
在System.Data.Linq.dll里,對數(shù)據(jù)庫的查詢做了支持,不過目前微軟提供的只支持Sql Server,感謝開源社區(qū),現(xiàn)在有了DbLinq,它提供了對MySql,Oracle,Sql Server,PostgreSql,Sqlite的支持。
System.Xml.Linq.dll在更高層次對Xml的訪問做了支持
這樣你從微軟這里獲得了:Linq to Objects 對內(nèi)存中的集合的支持、Linq to Xml 對Xml的支持、Linq to SQL 對Sql Server的支持
這是一張從Linq in Action那本書里的截圖,該圖很好的在一個大的層次上揭示了Linq的視圖。C#、vb.NET等一系列.NET語言在一些語言特性和Linq對語言的擴(kuò)展上對Linq家族提供了支持。未來我們將會實(shí)現(xiàn)Linq in Everywhere,Linq將成為你的變成習(xí)慣。
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實(shí)例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
C#對Linq的語言層面支持
使用
result = books.Where(book=>book.Title.StartsWith("I")).OrderBy(book=>book.Price)
.Select(book=>new{Key=book.Title,Value=book.Price});
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實(shí)例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
廢話那么多了,還是來幾個HelloWorld式的程序吧
HelloWorld Linq
(下面所有程序的Book就是本系列文章中第一篇所出現(xiàn)的Book類)
有一個Book集合,但是這個集合具體存儲哪里我們并不清楚,也許在內(nèi)存,也許在數(shù)據(jù)庫,也許在XML存儲,我們要做的就是把價格大于50的給揪出來,然后按照價格排序。
Linq to Objects(從內(nèi)存中的集合里查找)
數(shù)據(jù)準(zhǔn)備階段
//這樣的一個集合,存儲在內(nèi)存中IList<Book> books = new List<Book> {
new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 },
new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 },
new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 }
};
it知識庫:走進(jìn)Linq-Linq大觀園,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。