我有一个很大的电子邮件列表,我需要检查测试,看看它们是否包含字符串。我只需要做一次。我最初只需要检查他们的电子邮件是否与电子邮件列表中的任何电子邮件相匹配。
我使用的if(ListOfEmailsToRemoveHashSet.Contains(email)) { Discard(email); }很好,但是现在我需要检查是否有部分匹配,所以我尝试将其反转,但是如果我使用相同的方法,我将测试它,就像.if (ListOfEmailsHashSet.Contains(badstring)。很明显,这会告诉我正在查找哪个字符串,但没有告诉我哈希集中的哪个索引包含坏字符串。
我看不出有什么办法能让这件事在我还快的时候完成。
是否有人知道我可以使用一个函数来返回匹配项的HashSet、匹配项的索引,或者与此无关的任何方法?
发布于 2011-07-18 16:40:00
我只需要做一次。
如果是这样的话,性能就不应该是真正的考虑因素。像这样的事情应该有效:
if(StringsToDisallow.Any(be => email.Contains(be))) {...}另外,您可能需要考虑使用正则表达式,而不是直接使用包含字符串的黑名单。他们会给你一种更强大、更灵活的找到匹配的方法。
如果性能确实是一个问题,那么您必须找到一个更适合全文搜索的数据结构。最好利用像Lucene.NET这样的现有工具。
发布于 2017-11-08 12:33:57
这里只是一个注释,我们有一个程序,任务是上传超过10万pdf/excel/doc等,每次文件被上传,一个条目是在一个文本文件中。每天晚上,当程序运行时,它会读取这个文件,加载记录并将其添加到static HashSet<string> FilesVisited = new HashSet<string>(); FilesVisited.Add(reader.ReadLine());中。
当程序试图上传一个文件时,我们必须首先扫描HashSet,看看我们是否已经处理了该文件。我们发现,if (!FilesVisited.Contains(newFilePath))...将花费大量时间,不会给出正确的结果(即使文件路径在那里),FilesVisited.Any(m => m.Contains(newFilePath))也是一个缓慢的操作。
我们发现最快的最好方法是传统的
foreach (var item in FilesVisited)
{
if (item.Contains(fileName)) {
alreadyUploded = true;
break;
}
}我只是想和你分享这个..。
https://stackoverflow.com/questions/6736209
复制相似问题