在HashSet中搜索字符串<string> Performance

时间:2016-08-15 02:47:53

标签: c# .net c#-4.0

我有一个HashSet<string>,有大约50,000名成员。我有另一个对象列表,我一个接一个地迭代,以确定对象的电子邮件是否存在。如果是,我需要对该对象执行一些操作。

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);     
   }
}

如何加快评估字符串列表中是否存在一个字符串?

2 个答案:

答案 0 :(得分:5)

您没有正确使用HashSet。使用Linq的.Any()实际上将根据存储在HashSet中的每个元素来评估您的条件。

要搜索HashSet中是否存在某个项目(使用O(1)),请使用emailHash.Contains(object.Email)

答案 1 :(得分:3)

一个明显的变化是使用Enumerable.Any() LINQ函数,这基本上否定了通过执行顺序搜索来使用哈希集的优势。

相反,使用HashSet的内置Contains(string)函数:

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