若系統有一些比較靜態資料或是低頻率更新的資料
直覺會直接用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