SlideShare une entreprise Scribd logo
1  sur  84
Linq實戰
大綱
 轉型
 篩選
 選取
 排序
 連接
 鑄型
 聚合
 集合操作
 產生
 存在
轉型
 AsEnumerable
 AsQueryable
 Cast
 OfType
AsEnumerable
 將實做了IEnumerable<T>的物件強制
轉型成IEnumerable<T>。
 (實務)多應用於DataTable這個類別的
物件轉型成為IEnumerable<DataRow>
在DataTable上的範例
AsQueryable
 將實做了IEnumerable<T>介面的物件
轉型成為IQueryable<T>介面。
 IQueryable<T>繼承了
IEnumerable<T>,不同之處在於
IEnumerable許多方法的操作是在記憶
體中的物件,而IQueryable是將一連串
的操作方法轉換成表達式樹之後再執行。
Cast/OfType的源起
 C# 2.0版本並沒有實做IEnumerable介
面,為達成向下相容,讓C# 3.0之前的集
合物件仍可以Linq操作,故提出Cast和
OfType這兩個方法供其轉型成
IEnumerable介面。
Cast和OfType的差異
 Cast將集合中每個元素都轉換成指定型
別的IEnumerable介面,若集合中存在一
個無法轉型的元素就會拋出例外。
 OfType會跳過無法轉型的元素。
Cast/OfType
篩選
 Where
 First/FirstOrDefault
 Single/SingleOrDefault
 Skip/SkipWhile
 Take/TakeWhile
 Last/LastOrDefault
Where
 給予篩選條件,挑選需要的元素
 Where有兩個函數簽章:
◦ Where(this IEnumerable<T> source,
Func<T, bool> predicate)
◦ Where(this IEnumerable<T> source,
Func<T, int, bool> predicate)
 第一種較常使用
Where的使用方式
First/FirstOrDefault
Single/SingleOrDefault
 限定僅回傳一個,若回傳值超過一個則
會拋出例外。
Single與First的不同
 First是取得結果集中的第一個;Single限
定只有一個。
 兩者的差別在於應用場合,若商業邏輯
規則中就是限定只有一個應該要使用
Single。
Take/TakeWhile
 Take方法的輸入參數僅是一個整數數
值;用以標示從結果集中取得指定個數
的資料列。
 TakeWhile的輸入參數是一個委派型別;
可以用以撰寫取得資料的條件。
Take/TakeWhile的應用
Where和TakeWhile的差別
•TakeWhile巡覽元素時,只要遇到不符合條件的元素就會停下來。
•Where會巡覽整個集合元素,將所有符合條件的元素都取出。
Skip/SkipWhile
 Skip旨在由第一個元素開始計數,跳過
幾個元素,取剩下所有元素。
 SkipWhile的While其意義如同
TakeWhile的While,都是遇到不符合條
件的元素就停止跳過的動作。
Paging(分頁)
 當資料量極為龐大時,依照資源管理的
角度在看系統設計時,會考慮採用分頁
顯示資料的方式。
 Skip+Take => Paging。
Last/LastOrDefault
 與First相反;取集合中最後一個元素。
ElementAt/ElementAtorDefault
 ElementAt回傳指定索引的元素。其效
果如同陣列索引子。
選取
 Select
 SelectMany
Select
 與Where並列最常使用的指令。
 Select針對集合中每一個元素挑取該元
素或是該元素的屬性值。
Select的應用
Select的另一個函數簽章
 IEnumerable<S> Select<T,S>(
this IEnumerable<T> source,
Func<T, int, S> selector)
 重點就在那個整數型別的輸參數,該參
數是由Linq本身給予的,其值的內容為
元素的索引值。(亦很常用到)
Select與匿名類別
 Select本質上就是集合論中的投影操作;
投影出來的結果某些時候與集合中元素
差異很大,並且投影的結果集僅會在該
函數中使用,可以考慮使用匿名類別。
Select與匿名類別的混搭
SelectMany
 若集合的元素本身是可以被列舉(有實
做IEnumerable介面),則SelectMany會
再展開。
SelectMany的簡單應用
SelectMany複雜應用
等價
SelectMany實戰應用場景
 SelectMany由於具有展開的特性,通常
都用於處理巢狀結構的資料,當資料巢
狀的層數越多越需要使用SelectMany。
排序
 Order
 OrderByDescending
 ThenBy
 ThenByDescending
 Reverse
為什麼要有
ThenBy,ThenByDescending?
 OrderBy/OrderByDescending要求的輸
入參數資料型別為IEnumerable<T>,但
其輸出資料型別為
IOrderEnumerable<T>,故,若需要就排
序結果進行再排序,就無法使用
OrderBy/OrderByDescending。
OrderBy,OrderByDesceding
 共有兩個函數簽章:
IOrderedEnumerable<T> OrderBy<T,
K>(this IEnumerable<T> source,
Func<T, K> keySelector);
IOrderedEnumerable<T>
OrderBy<T,K>(this IEnumerable<T>
source, Func<T,K> keySelector,
IComparer<K> comparer)
Order的運用
OrderBy的排序
 Order的排序是屬於不穩定排序;亦即其
排序不會理會元素插入的順序。
 例: 集合 c = new 集合();
c.Add(A);
c.Add(A’);
=>A’比A晚到,但OrderBy類的排序是不
按照順序的。
Reverse
 將集合中的元素依其順序顛倒。
連接
 Join/Groupjoin
 GroupBy
Join和GroupJoin
Id Value
1 A
2 B
3 C
Id ChildValue
1 a1
1 a2
1 a3
2 b1
2 b2
Id ChildValue
A a1
A a2
A a3
B b1
B b2
Id ChildValue
A [a1,a2,a3]
B [b1,b2]
C []
Join
GroupJoin
Join/GroupJoin
 Join與SQL指令的Join作業模式一致。
 GroupJoin的作業模式為:
主表Left Join子表,再以主表作為Group
By的參考。
Join實測
GroupJoin實測
GroupBy
 GroupBy的使用效果如同SQL中的
Group;都是依照指定的欄位將其資料群
組化。
 Linq在進行GroupBy操作時,預設會使
用EqulityComparer<T>.Default作為元
素比較的比較器。
 GroupBy的回傳型別是
IGrouping<K,E>;K是鍵值型別,E即為元
素資料型別。
GroupBy的應用
鑄型
 Array/List
 Dictionary/LookUp
鑄型
 Linq的操作都是由介面IEnumerable所
提供的,但某些時候需要將IEnumerable
實際轉換成指定的型別作處理,這時候
就需要鑄型。
 通常會需要鑄型的時機都是需要用到該
集合類別提供的特殊API。
List/Array
ToDictionary
 Dictionary是.Net用來處理鍵值對集合
最常被使用到的集合類別。
 ToDictionary一共有三個函數簽章,其中
常被使用的僅有兩個。
ToDictionary的應用
ToLookUp
 LookUp與Dictionary有著很大的分別就
在於LookUp的鍵值允許重覆;亦即一個
鍵值可以對應到多個值。
(一對多)
ToDictionary的資料來源指定的鍵
值發生重覆
改以ToLookUp
聚合
 Average/Max/Min/Sum
 Count/LongCount
 Aggregate
Average/Max/Min/Sum
Count/LongCount
 Count與LongCount皆是取得集合的元
素個數,但某些集合的元素個數可能超
過int所能負荷的值,故,LongCount就是
用以處理超大量的元素個數;但仍受限
於Long所能承受的。
Aggregate
 每個元素都會套入指定的Lambda表達
式,並且該Lambda的第一個輸入參數為
上一個元素運算後的結果。
Aggregate的應用
集合操作
 Distinct
 Except
 Intersect
 Union
Distinct
 Distinct在處理上會呼叫集合元素的
equals和getHashCode方法來評估元素
是否重覆。
Distinct的應用
集合操作
 集合操作如同數學集合論一般的操作。
◦ Except: 差集
◦ Intersect: 交集
◦ Union: 聯集
集合論
A B∪ = AB
A ∩ =B
A - =B
聯集
交集
差集
集合操作
產生
 DefaultIfEmpty
 Empty
 Range
 Repeat
DefaultIfEmpty
 當存取的集合無任何元素,呼叫
DefaultIfEmpty時會自動產出一個集合;
該集合中的元素皆為型別的預設值。
 兩種函數簽章:
◦ DefaultIfEmpty<T>(this IEnumerable<T>
source)
◦ DefaultIfEmpty<T>(this IEnumerable<T>
source, T defaultValue)
DefaultIfEmpty的應用
Empty
 產生一個指定泛型型別的IEnumerable
集合。
 這是Enumerable的靜態方法不是
IEnumerable的擴充方法。
Range
 Range可以產生指定起迄的整數數列。
 Range也是Enumerable的靜態方法。
Repeat
 產生指定重覆次數的相同整數值。
 此為Enumerable的靜態方法。
存在
 Any
 All
 Contain
Any
 集合中只要任一個元素滿足條件,即回
傳true。(不給Lambda表達式則直接回
傳true)
Any的應用
All
 集合中每一個元素都要符合條件才會回
傳true。
All的應用
Contain
 Contain主要功能在於判斷集合中是否
有包含指定的元素。(使用
EqualityComparer<T>.Default來判斷
是否相等)
 Contain有兩個函數簽章,不同之處在於
第二個簽章允許輸入實作
IEqualityComparer<T>介面的物件。
Contains的應用
補遺
 Concat
 SequenceEqual
Concat
 將兩個泛型型別相同的集合合併成一個。
SequenceEqual
 兩個集合依每次循環都取出同一索引的
元素以Equals方法比較,直到兩個集合
的元素都被巡覽過一次後回傳是否相同。
 只要兩組集合的元素有一對是不相同或
是兩組集合的元素個數不一致都會回傳
False。
SequenceEqual應用
函數 功用 延遲?
Aggregate 遞迴處理
All 判斷集合中所有元素是否都符合條件
Any 判斷集合中只要有一個元素符合條件
AsEnumerable 轉型成IEnumerable<T>物件
Average 取得數字集合的平均值
Cast 轉型成IEnumerable<T>物件
Contains 判斷集合中是否有指定元素
Count 計算集合的元素個數
DefaultIfEmpty 若集合無元素則產生一個
Distinct 去除重覆元素
ElementAt 取得指定索引的元素
ElementAtOrDefault 取得指定索引的元素,若無則回傳預設值
Empty 產生一個空的集合
Except 差集
First 取得第一個元素
FirstOrDefault 取得第一個元素,若無則回傳預設值
函數 功用 延遲?
GroupBy 群組化
GroupJoin 將聯合後的結果群組化
Intersect 交集
Join 聯合兩個集合
Last 取得最後一個元素
LastOrDefault 取得最後一個元素,若無則是預設值
LongCount 計算元素個數(回傳Long)
Max 計算數值集合的最大值
Min 計算數值集合的最小值
OfType 轉型成IEnumerable<T>(i.e.會跳過例外)
OrderBy 依條件排序
OrderByDescending 依條件逆排序
Range 產生指定起迄的整數集合
Repeat 產生指定個數及數值的集合
Reverse 顛倒集合的元素順序
Select 投影操作
函數 功用 延遲?
SelectMany 投影操作並展開
SequenceEqual 並行比較兩個集合是否相等
Single 取定並限制僅有一個元素
SingleOrDefault 取得並限制僅有一個元素,若非則是預設值
Skip 從集合前面跳過指定個數,再取剩下的元素
SkipWhile 依條件跳過前面元素,再取剩下的所有元素
Sum 計算數值集合的總合值
Take 依指定個數取得集合前面的元素
TakeWhile 依指定條件取得集合前面的元素
ThenBy 再排序
ThenByDescending 再逆排序
ToArray 鑄型成為陣列
ToDictionary 鑄型成為Dictionary型別
ToList 鑄型成為List<T>
ToLookUp 鑄型成為LookUp
Union 聯集
Where 依條件取得元素

Contenu connexe

En vedette

презентація Сім чудес новгородківщини
презентація Сім чудес новгородківщинипрезентація Сім чудес новгородківщини
презентація Сім чудес новгородківщиниMyagkova Tanya
 
Java Spring hibernate training
Java Spring hibernate trainingJava Spring hibernate training
Java Spring hibernate trainingDucat Education
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練22015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2Duran Hsieh
 
Entity framework 與 LINQ
Entity framework 與 LINQEntity framework 與 LINQ
Entity framework 與 LINQSean Lu
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課Sean Lu
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練12015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1Duran Hsieh
 
Proyecto formativo
Proyecto formativoProyecto formativo
Proyecto formativoAna Sanjines
 
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)กมลรัตน์ ฉิมพาลี
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4Duran Hsieh
 
Asp.net mvc 概觀介紹
Asp.net mvc 概觀介紹Asp.net mvc 概觀介紹
Asp.net mvc 概觀介紹Alan Tsai
 
Entity framework + Linq 介紹
Entity framework + Linq 介紹Entity framework + Linq 介紹
Entity framework + Linq 介紹Alan Tsai
 
การออกแบบโปสเตอร์ รางวัลระดับประเทศ
การออกแบบโปสเตอร์ รางวัลระดับประเทศการออกแบบโปสเตอร์ รางวัลระดับประเทศ
การออกแบบโปสเตอร์ รางวัลระดับประเทศกมลรัตน์ ฉิมพาลี
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練62016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6Duran Hsieh
 
P1012016 Charla sobre la Política del Miedo
P1012016 Charla sobre la Política del MiedoP1012016 Charla sobre la Política del Miedo
P1012016 Charla sobre la Política del MiedoVENTURA Contenidos
 

En vedette (15)

презентація Сім чудес новгородківщини
презентація Сім чудес новгородківщинипрезентація Сім чудес новгородківщини
презентація Сім чудес новгородківщини
 
Java Spring hibernate training
Java Spring hibernate trainingJava Spring hibernate training
Java Spring hibernate training
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練22015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
 
Entity framework 與 LINQ
Entity framework 與 LINQEntity framework 與 LINQ
Entity framework 與 LINQ
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練12015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
 
Proyecto formativo
Proyecto formativoProyecto formativo
Proyecto formativo
 
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)
บันทึกประสบการณ์เรียนรู้ที่ UVIC (ฉบับปรับปรุง)
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
 
Asp.net mvc 概觀介紹
Asp.net mvc 概觀介紹Asp.net mvc 概觀介紹
Asp.net mvc 概觀介紹
 
Entity framework + Linq 介紹
Entity framework + Linq 介紹Entity framework + Linq 介紹
Entity framework + Linq 介紹
 
การออกแบบโปสเตอร์ รางวัลระดับประเทศ
การออกแบบโปสเตอร์ รางวัลระดับประเทศการออกแบบโปสเตอร์ รางวัลระดับประเทศ
การออกแบบโปสเตอร์ รางวัลระดับประเทศ
 
Mind mapping genetics
Mind mapping geneticsMind mapping genetics
Mind mapping genetics
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練62016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
 
P1012016 Charla sobre la Política del Miedo
P1012016 Charla sobre la Política del MiedoP1012016 Charla sobre la Política del Miedo
P1012016 Charla sobre la Política del Miedo
 

Plus de 國昭 張

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration國昭 張
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture國昭 張
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1國昭 張
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺國昭 張
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模國昭 張
 
Scrum essential
Scrum essentialScrum essential
Scrum essential國昭 張
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計國昭 張
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析國昭 張
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0國昭 張
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js國昭 張
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇國昭 張
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 

Plus de 國昭 張 (20)

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模
 
單元測試
單元測試單元測試
單元測試
 
Docker實務
Docker實務Docker實務
Docker實務
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Vue
VueVue
Vue
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
 
DDD引導
DDD引導DDD引導
DDD引導
 
前端測試
前端測試前端測試
前端測試
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js
 
React js
React jsReact js
React js
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 

Linq實戰