若系統有一些比較靜態資料或是低頻率更新的資料
直覺會直接用List<DataModel> 然後再搭配 LINQ First() 去找查資料
但如果在高頻的查找情境中,選擇 Dictionary 或 List 會直接影響效能
List 優點
記憶體友好:無需額外的結構,資料量少時非常高效
順序性:保留資料的順序,便於處理需要按順序操作的資料
List 缺點
查找效能低:查找的時間複雜度為 O(n),資料量大時會顯著影響性能
資料唯一性:無內建機制保證鍵值唯一,需手動檢查
List 查找範例
var list = new List<KeyValuePair<int, string>> { new KeyValuePair<int, string>(1, "Alice"), new KeyValuePair<int, string>(2, "Bob"), new KeyValuePair<int, string>(3, "Charlie") }; // 查找 Key 為 2 的資料 var result = list.FirstOrDefault(x => x.Key == 2); Console.WriteLine(result.Value); // Output: Bob
當資料量為 1,000,000 時,List 查找需要 O(n) 的時間,線性增加
Dictionary 優點
高效查找:基於哈希表,時間複雜度為 O(1),非常適合頻繁查找
鍵值結構:方便以唯一鍵 (Key) 儲存和查找資料
易於管理資料:避免重複資料的存在,直接覆蓋
Dictionary 缺點
記憶體消耗高:需要額外的儲存空間來維護哈希表
順序不可控:資料無序,遍歷可能會因為順序問題導致效能損耗
Dictionary 查找範例
var dictionary = new Dictionary<int, string> { { 1, "Alice" }, { 2, "Bob" }, { 3, "Charlie" } }; // 查找 Key 為 2 的資料 var result = dictionary.TryGetValue(2, out var value) ? value : "Not Found"; Console.WriteLine(result); // Output: Bob
當資料量為 1,000,000 時,Dictionary 查找的時間幾乎恆定(O(1))
效能比較
特性 | Dictionary | List |
---|---|---|
查找時間複雜度 | O(1)(基於哈希) | O(n)(線性搜尋) |
資料插入或更新時間 | O(1) | O(1)(添加至尾部),O(n)(插入至中間) |
記憶體使用量 | 高(儲存哈希表需要額外空間) | 低 |
適用場景 | 頻繁查找資料 | 資料量少或操作順序較重要 |
結論
- 資料量大,且需要頻繁查找時,Dictionary 是最佳選擇
- 需要保證鍵的唯一性並快速獲取資料,Dictionary 是最佳選擇
- 如果資料量小且偶爾查找,List 更簡單且記憶體友好
- 需要更多用於迭代處理或保留插入順序的場景,List 是最佳選擇
- 避免無需的 First() 查找,當有固定鍵值時,優先考慮使用 Dictionary