走進Linq-Linq to Objects(上)基礎篇
[2] 走進Linq-Linq to Objects(上)基礎篇
系列文章導航:
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進Linq-Linq to SQL How do I(1)
走進Linq-Linq to SQL How do I(2)
走進Linq-Linq to SQL How do I(3)
走進Linq-Linq to SQL源代碼賞析 Table的獲取過程
走進Linq-Linq to SQL源代碼賞析之Provider的初始化
走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
話說自從編程大師走了后年輕的Coder很是郁悶了一會兒,他在想,為什么,我還以為是一個偉大的工程,我正準備把我寫的代碼作為一個opensouce project 分享出去,微軟卻干了。哎,還是要被微軟牽著鼻子走一遭了。
在上一章里介紹了,Linq里那些查詢操作都是給IEnumerable接口添加的擴展方法(這些方法在Linq里被稱為查詢操作符),那么就可以以方法調用的方式使用Linq了:
注意到沒有,上面所有的方法都是操作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啊,還真有點不習慣,那下面我們就來看看這個查詢表達式到底是個啥玩意兒。