.net 大數據量,查找Where優化(List的Contains與Dictionary的ContainsKey的比較)


 最近優化一個where查詢條件,查詢時間很慢,改為用Dictionary就很快了。

 

 一、樣例

 

假設:listPicsTemp 有100w條數據,pictures有1000w條數據。

 

使用第1段代碼執行超過2分鍾。

var listPicsTemp = new List<string>();

pictures = pictures.AsParallel().Where(d => listPicsTemp.Contains(d.Pic)).ToList();

 

使用第2段代碼執行十幾毫秒。

var listPicsTemp = new List<string>();

var dicPicsTemp = listPicsTemp.Where(d => d != null).Distinct().ToDictionary(d => d);//使用Dictionary類型,速度快很多

pictures = pictures.AsParallel().Where(d => dicPicsTemp.ContainsKey(d.Pic)).ToList();

 

二、為什么Dictionary這么快呢?查看了一下微軟官方文檔。

 

下面截圖來源:https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.7.2

 

 

三、查看源碼

 

List的源碼:https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646

List的Contains,是循環for查找的。

 

Dictionary的源碼: https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,bcd13bb775d408f1

Dictionary的ContainsKey,是通過hash查找的。

 

 

 四、小結:

1、Dictionary<TKey,TValue>類實現為哈希表。ContainsKey() 內部是通過Hash查找實現的,查詢的時間復雜度是O(1)。所以,查詢很快。(List的Contains是通過for查找的)

2、Dictionary不是線程安全的。(查看微軟官方文檔,確實能學到很多知識盲區。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM