.NET Dictionary vs List LINQ First() 查找效能

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

效能比較

特性DictionaryList
查找時間複雜度O(1)(基於哈希)O(n)(線性搜尋)
資料插入或更新時間O(1)O(1)(添加至尾部),O(n)(插入至中間)
記憶體使用量高(儲存哈希表需要額外空間)
適用場景頻繁查找資料資料量少或操作順序較重要

結論

  • 資料量大,且需要頻繁查找時,Dictionary 是最佳選擇
  • 需要保證鍵的唯一性並快速獲取資料,Dictionary 是最佳選擇
  • 如果資料量小且偶爾查找,List 更簡單且記憶體友好
  • 需要更多用於迭代處理或保留插入順序的場景,List 是最佳選擇
  • 避免無需的 First() 查找,當有固定鍵值時,優先考慮使用 Dictionary


訂閱
通知
guest
0 留言
預約回饋
查看所有留言