相当于HashSet.包含返回HashSet或索引

本文关键字:HashSet 索引 包含 相当于 返回 | 更新日期: 2023-09-27 18:02:40

我有一个大的电子邮件列表,我需要检查测试,看看它们是否包含字符串。我只需要做一次。我最初只需要检查他们的电子邮件是否与电子邮件列表中的任何电子邮件相匹配。

我使用if(ListOfEmailsToRemoveHashSet.Contains(email)) { Discard(email); }这工作得很好,但现在我需要检查部分匹配,所以我试图反转它,但如果我使用相同的方法,我会测试它像……if (ListOfEmailsHashSet.Contains(badstring)。显然,它告诉我正在找到哪个字符串,但不告诉我哈希集中哪个索引包含错误的字符串。

我看不出有什么办法能在保持速度的同时完成这项工作。

有没有人知道我可以使用的函数,将返回匹配的哈希集,匹配项的索引,或任何方式?

相当于HashSet.包含返回HashSet或索引

我只需要做一次。

如果是这种情况,性能就不应该被考虑。像这样的代码应该可以工作:

if(StringsToDisallow.Any(be => email.Contains(be))) {...}

附带说明,您可能想要考虑使用正则表达式而不是包含字符串的直接黑名单。他们会给你一个更强大,更灵活的方式来查找匹配。

如果性能确实是一个问题,您将不得不找到一个更适合全文搜索的数据结构。最好利用现有的工具,如Lucene.NET。

在这里提醒一下,我们有一个程序的任务是上传超过100,000个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;
     }
   }

只是想分享一下....