在HashSet<string>中查找字符串的性能问题

3

我有一个包含大约5万个成员的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);     
   }
}

我该怎么加快判断一个字符串是否存在于字符串列表中的评估速度?

2个回答

9

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

要搜索HashSet中是否存在项目(具有常量时间O(1)),请使用emailHash.Contains(object.Email)


4

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接