程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(上)基礎篇

編輯:關於.NET

話說自從編程大師走了後年輕的Coder很是郁悶了一會兒,他在想,為什麼,我還以為是一個偉大的工程,我正准備把我寫的代碼作為一個opensouce project 分享出去,微軟卻干了。哎,還是要被微軟牽著鼻子走一遭了。

在上一章裡介紹了,Linq裡那些查詢操作都是給IEnumerable接口添加的擴展方法(這些方法在Linq裡被稱為查詢操作符),那麼就可以以方法調用的方式使用Linq了:

books.Where(book=>book.Title.StartsWith(“L”)).OrderBy(book=>book.Price).Select(book=>new{key=book.Title,value=book.Price};

注意到沒有,上面所有的方法都是操作IEnumerable的,然後也是返回IEnumerable類型的對象。可以把這些方法按照用途分個類(一些一看名字就知道意思的我就不做過多說明了):

用途 方法 映射的(就是將查詢的結果映射成需要的結果) Select(2個重載),SelectMany(4個重載) 條件過濾 Where(2個重載),OfType(這個方法是對IEnumerable擴展的,使用的時候要帶上泛型參數,books.OfType(),意思就是從books集合裡遍歷元素,如果這個元素是Book類型或其子類型就將其添加到返回集合中) 排序(注意排序的方法放回的是繼承自IEnumerable的IOrderedEnumerable) OrderBy(2個重載), OrderByDescending(2個重載), Reverse(不干別的,就是把IEnumerable的順序倒一下), ThenBy, ThenByDescending(這兩個是對IOrderedEnumerable的擴展方法,所以它只能用在OrderBy後面,它的作用就是在一個已排序的系列上再按照某個key排序一次) 分組 GroupBy(8個重載), ToLookup(4個重載,它們的作用是根據一個key將IEnumerable轉化為一個ILookUp對象,這個對象將按照key分組元素) 聯結 GroupJoin,Join 轉型 Cast(Linq只能操作泛型的集合!誰告訴你Linq只能操作泛型的集合?這個方法就是干這事情的,它是對IEnumerable擴展的一個方法,將一個IEnumerable轉型為IEnumerable,然後你就可以享受Linq了,比如我用ArrayList保存一個User集合,ArrayList users = new ArrayList();但是Linq的那些什麼Where啊,並沒有對ArrayList所實現的接口IEnumerable進行擴展,怎麼辦?用Cast:IEnumerable myUsers = users.Cast();就這麼簡單)

但是微軟的哥們認為這種方式還是不人本化(或者那些哥們說,這樣顯得Linq太簡單了,就添加幾個擴展方法,顯得咱們多沒水平啊),如是他們弄出個“查詢表達式”的玩意兒,像俺們這群搞C語系搞多了的人,突然一下子在C#裡看到什麼from啊,什麼select啊,還真有點不習慣,那下面我們就來看看這個查詢表達式到底是個啥玩意兒。

C# 3.0裡又添加了一大把關鍵字,硬是造出個“查詢表達式”(這又是一個語法糖)的東西來。實際上上面那段方法調用方式的Linq可以改寫成這樣:

frombookinbooks

wherebook.Title.StartsWith(“L”)

orderbybook.Priceascending

selectnew{key=book.Title,value=book.Price};

貌似很接近SQL,不過看上去總是感覺怪怪的,不過習慣就好,這種語法使用一種查詢的風格去寫代碼,我想也許就是有了這個查詢表達式,而不是方法調用的方式寫代碼,這東西稱作語言集成查詢才更貼近吧。在內部,C#編譯器會將這段代碼轉換為方法調用。

這種風格初一看還真不好理解,Linq in Action這本書給出了一張圖來說明查詢表達式的語法:

(圖中中括號說明是可選的,大括號說明是可以0個或多個)

一個查詢表達式是從一個from子句開始的,後面跟著聯結,條件過濾,排序,而且還可以是多個,最後以select或者group by結束。這裡的from的作用就是引入一個變量,使用這個變量表示遍歷跟在in後面的source序列裡面的元素。

既然查詢表達式最後都可以轉換成方法的調用,那我們就來看看它們之間的映射關系吧,不過在C#裡面有的方法調用沒有對應的查詢表達式vb.net裡面卻有。

GroupBy方法對應著group…by或者group…by…into…,有啥區別呢?group…by後面就不能跟東西了,這個查詢表達式也就結束了,而group…by…into…還能繼續,into後面跟著的是一個IGrouping對象,已分組了,後面的表達式你就可以利用這個對象干些事情,比如求分組內的和啊等等。ThenBy方法就對應這orderby…,…(排序再排序)。Join方法對應的查詢表達式比較復雜:join…in…on…equals…,join的作用和from一樣,引入一個變量,用於表示跟在in後面序列內的對象,on後面跟著聯結條件。

不過遺憾的是在C#裡並不是所有的查詢操作符(就是那些擴展方法)都有對應的查詢表達式,所以有的時候你還是要借助方法調用的方式。

從查詢表達式的寫法上來看,如果比較簡單的查詢用查詢表達式較好,但是復雜的查詢,特別有join啊,還有多個from啊查詢表達式將非常復雜,所以這個時候還是建議使用方法調用,這樣可讀性也許更好點。

Linq的理論部分也基本講完了,本系列後續部分將借助實例講解,我想可能好點,如果大家有什麼更好的建議歡迎提出。

祝大家編程愉快

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved