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);
}
}
我能做些什么来加速一个字符串是否存在于字符串列表中的计算?
您没有正确使用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);
}
}