Searching for a string in HashSet<string> Performance

本文关键字:string lt gt Performance HashSet for in Searching | 更新日期: 2023-09-27 18:02:34

我有一个HashSet<string>有~50k成员。我有另一个对象列表,我正在逐个迭代以确定对象的电子邮件是否存在。如果有,我需要对对象执行一些操作。

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

我能做些什么来加速一个字符串是否存在于字符串列表中的计算?

Searching for a string in HashSet<string> Performance

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

使用emailHash.Contains(object.Email)查找HashSet(时间固定,O(1))中是否存在项

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

请使用HashSet的内置Contains(string)函数:

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