2016-08-15 48 views
-1

我有一個HashSet<string>,約有50k個成員。我有另一個對象列表,我正在逐個迭代以確定對象的電子郵件是否存在。如果是這樣,我需要對該對象執行一些操作。在HashSet中搜索字符串<string>性能

var emailList = db.Emails.Select(s => s.EmailAddress.ToLower()).ToList(); 
var emailHash = new HashSet<string>(emailList); 
var objects = db.Objects.ToList(); 
// everything is fine up to this point 
foreach (var object in objects) { 
    if (!emailHash.Any(s => s.Equals(object.Email))) { // This takes ~0.3s 
     Console.WriteLine("Email: {0}", object.Email);  
    } 
} 

我該怎麼做才能加快評估一個字符串是否存在於一個字符串列表中?

回答

4

您沒有正確使用HashSet。使用Linq的.Any()實際上會根據存儲在HashSet中的每個元素評估你的條件。

要搜索HashSet中是否存在項目(使用固定時間,O(1)),請使用emailHash.Contains(object.Email)

2

一個明顯的變化是不是使用Enumerable.Any() LINQ函數,這基本上否定了通過執行順序搜索使用哈希集的優點。

相反,使用的HashSet的內置Contains(string)功能:

foreach (var object in objects) { 
    if (!emailHash.Contains(object.Email)) { 
     Console.WriteLine("Email: {0}", object.Email);  
    } 
}