DAY 22 LINQ 查詢運算式
LINQ
Language Integrated Query (LINQ) 是一組以直接將查詢功能整合至 C# 語言為基礎之技術的名稱。
「查詢」是指從資料來源中擷取資料的運算式。查詢通常以特定的查詢語言來表示。
查詢運算式使用類似 SQL 或 XQuery 的宣告式語法來查詢 IEnumerable 集合。
透過 LINQ,查詢現在已成為第一級的語言建構,就如同類別、方法、事件等等。
在編譯時期,查詢語法會轉換成對 LINQ 提供者實作的標準查詢運算子擴充方法進行的方法呼叫。
簡單說就是 C# 的資料查詢語法,任何實作 IEnumerable 的集合都可以操作,本篇會用 Lambda 來撰寫 LINQ。
使用前需先引用命名空間 System.Linq
。
既然提到了資料查詢,有學過 SQL 的都知道 SELECT, FROM, WHERE 這三個關鍵字吧。所以你應該看得懂官方的範例
1 | int[] scores = new int[] { 97, 92, 81, 60 }; |
但今天並不是要教你這樣撰寫,而是使用 Lambda,將 LINQ 改寫成
1 | int[] scores = new int[] { 97, 92, 81, 60 }; |
scores 為欲查詢集合,Where 引數為 Predicate 提供給他一個篩選條件,Select 引數為 Func 告訴他我們需要傳回什麼內容,忘了 Predicate 與 Func 可以看 DAY 17 委派的介紹。
個人覺得 Lambda 可讀性比較好,比較 Functional。
Select
Select 可以將集合內的元素轉換成新的樣式,如
1 | int[] scores = new int[] { 97, 92, 81, 60 }; |
也可以更改集合成員內容,傳回一個匿名類型如
1 | var members = new List<Member> () { |
Where
Where 可以將集合內符合條件的元素取出,如
1 | var members = new List<Member> () { |
與 Select 差別可以說是,Where 負責垂直篩選,Select 負責水平篩選,在 LINQ 裡面這兩個可以說是最常使用的方法。
另外 x 這個變數是隨意取的,你可以取任何你想取的名稱,可以想像成是集合中的每一個元素。
在 Select 與 Where 方法中,你也可以再傳入一個 int 變數,代表在集合中的索引位置如
1 | int[] scores = new int[] { 97, 92, 81, 60 }; |
Count
Count 可以獲得集合內的元素數量,如
1 | var members = new List<Member> () { |
甚至是集合內符合條件的元素數量。
1 | var membersNameContainsMiCount = members |
OrderBy
OrderBy 可以將集合內的元素重新排序,如
1 | int[] scores = new int[] { 97, 92, 81, 60 }; |
一些小結論
今天介紹了 LINQ 是什麼以及基礎用法,明天也會繼續講說一些常用的方法,如果對 LINQ 有興趣的朋友,大力推薦下面去年鐵人賽的文章,這位大大寫的超級詳細,包含昨天的內容 foreach 與 yield,也介紹了 LINQ 原碼,鐵人賽有很多很棒的文章可以挖掘。
忘了介紹可能很多人在意的事情,那就是 LINQ 的念法,這與 Link 同音,所以不要念成 Lin Q 了。
對了,在使用 LINQ 時,永遠是以傳回值的方式進行,所以不會去更改原本的集合,並且傳回的是 IEnumerable 類型,這類型特性是什麼昨天也提過了,忘記可以回去看唷。
感謝閱讀。
參考資料
Language-Integrated Query (LINQ) (C#) | Microsoft Docs
LINQ 查詢簡介 (C#) | Microsoft Docs
支援 LINQ 的 C# 功能 | Microsoft Docs
深入探索LINQ | 2018 iT 邦幫忙鐵人賽