Array - Collection
當我們有一塊連續記憶體的資料結構(大小固定),就會有 Lengthf、values[i] 直接索引(O(1)),這是真正「已經全部在手上」的一批資料,適合需要高速索引、固定長度、確定要把資料一次放好的場景

它不是資料結構,它是「你可以被 foreach 一個個拿出來」的能力(介面),可能背後是 array / list / db query / 檔案讀取 / generator / yield return…,重點在於,它允許 deferred execution(延遲執行),也就是寫了 Select/Where 不代表立刻跑,是 foreach / ToList() / Count() 的那刻才真正開始取資料
這適合想要串接處理流程、資料可能很大、資料來源不是一次就全部拿到的場景(像 DB、串流、yield)

Enum.GetValues(Type) 是比較早期的 API,為了能支援「任何 enum 型別」,它回傳 Array(非泛型)。所以才需要
1 | values.Cast<PromotionEngineTypeEnum>() |
Cast<T>() 的作用是:把「非泛型可枚舉(IEnumerable)」裡面的每個元素,逐一轉成 T,變成 IEnumerable<T>,LINQ 才能舒服地用

1 | [] |
1 | var values = Enum.GetValues(typeof(PromotionEngineTypeEnum)); //// Array 非泛型集合 |
用途例如

1 | //// 檢查 request |

其實 T[] 本身就能 LINQ
1 | int[] a = { 1, 2, 3 }; |
Enum.GetValues(typeof(PromotionEngineTypeEnum))不能直接 Select 的原因是 values 的型別是 Array(非泛型),我們需要先變成 IEnumerable<PromotionEngineTypeEnum> 才行
「第 N 個元素」→ 用 Array/List(索引能力強)
已經把資料撈完(或快取好)放在記憶體,現在要直接拿第 0、1、2…筆做事
1 | var topUsers = new List<string> { "Allen", "Ben", "Cindy", "Dora" }; |

「串接一堆處理邏輯」→ 用 IEnumerable(管線思維)
只要近 7 天、付款成功、金額 > 1000 的訂單,最後只輸出你要的欄位
IEnumerable
1 | var reportRows = orders |

「馬上 materialize(實體化)成集合」→ 最後 ToArray() / ToList()
避免「資料來源很貴」被重複讀(DB / 檔案 / 網路)
1 | var expensiveQuery = GetOrdersFromDb() // 假設這裡會真的打 DB |

「避免一次載入大量資料」→ IEnumerable + 延遲執行(例如讀檔、DB query)
DB(EF Core)延遲執行:先組查詢,真的需要時才
1 | // IQueryable 也是 IEnumerable 的一種「更強版本」(可以翻譯成 SQL) |





