--- tags: LinQ, LinQ基礎 , C# --- # LINQ基礎 - Enumerable ### [Enumerable Class](https://docs.microsoft.com/zh-tw/dotnet/api/system.linq.enumerable?view=netframework-4.8) > 提供一組 static (在 Visual Basic 中為 Shared) 方法,用於查詢實作 IEnumerable<T> 的物件 > 傳回值序列的查詢中所使用的方法並不會耗用目標資料,直到列舉查詢物件。 這稱為 「 延後執行 」。 傳回單一值的查詢中所使用的方法執行,而且會立即耗用目標資料 上面告訴我們三件事情 1. Enumerable 這個靜態類別就是對型別 IEnumerable<T> 進行擴充. 讓所有實作 IEnumerable<T> 的型別都可以使用 Enumerable 內的擴充方法. 2. 方法的回傳型別若不是基礎型別(e.g. IEnumerable<T> ) , 則代表執行此方法 僅是回傳一個物件 , 但尚未開始執行動作. 會直到使用 Foreach 才會開始. - 延後執行 3. 方法的回傳型別若是基礎型別(e.g. double) , 則會馬上開始走訪. ### Enumerable 的內容 - > 參考91大的blog ![TzQDTov.jpg](https://github.com/s0920832252/LinQ-Note/blob/master/Resources/TzQDTov.jpg?raw=true) 由上面這張圖 , 我們可以知道其內部放置三種方法. - 針對 IEnumerable<T> 的擴充方法 - Where , Select , Max , Average 等等... - ![Ccf7Izj.png](https://github.com/s0920832252/LinQ-Note/blob/master/Resources/Ccf7Izj.png?raw=true) - 針對 IEnumerable 的擴充方法 - Cast<T> : 把 IEnumerable 中的成員都強制轉型成T , 若轉型失敗 , 會拋出例外. - OfType<T> : 把 IEnumerable 中 , 屬於 T 型別的成員都抽出來 - 透過上述兩個方法處理後 , 其型別都變成 IEnumerable<T> 了 , 因此也可以使用 IEnumerable<T> 的擴充方法. - Enumerable class 本身的靜態方法 - Range : 傳入 start 以及 count 兩個變數後 , 回傳一組 IEnumerable<int> 的序列 - Repeat : 產生一個重複 n 個 T 的序列 (IEnumerable<T>) - Empty : 產生一個空的 IEnumerable<T> --- ### 總結 - System.Linq 的精華幾乎都在 Enumerable 這個類別上, 因為其針對 IEnumerable 型別進行擴充. ( LinQ大部分的方法都在這個類別內) - 可以用 foreach 關鍵字進行走訪的型別一定有實作 IEnumerable 或 IEnumerable<T> 這兩個介面. 換句話說 , 可以用 foreach 走訪的型別都可能可以使用 LinQ 的方法進行處理. - LinQ 的方法( IEnumerable<T> 的擴充方法)就是透過泛型委派的參數(e.g. Func<T1, T2, …Tn, TResult>) , 來簡化繁複的 foreach 迴圈處理。 --- ### Thank you! You can find me on - [GitHub](https://github.com/s0920832252) - [Facebook](https://www.facebook.com/fourtune.chen) 若有謬誤 , 煩請告知 , 新手發帖請多包涵 # :100: :muscle: :tada: :sheep: