等效于返回HashSet或索引的HashSet.Contains?

时间:2011-07-18 16:34:56

标签: c# string linq performance hashset

我有一大堆电子邮件,我需要检查测试以查看它们是否包含字符串。我只需要这样做一次。我最初只需要查看他们是否通过电子邮件与电子邮件列表中的任何电子邮件进行了匹配。

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

在快速行动的时候,我看不到任何方法让这项工作成功。

有没有人知道我可以使用的函数会返回匹配项的HashSet,匹配项的索引,还是以此为其任何方式?

2 个答案:

答案 0 :(得分:2)

  

我只需要这样做一次。

如果是这种情况,性能不应该是一个考虑因素。这样的事情应该有效:

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

另外,您可能需要考虑使用正则表达式而不是包含字符串的直接黑名单。它们将为您提供更强大,更灵活的搜索方式。

如果性能确实成为一个问题,那么你必须找到一个更适合全文搜索的数据结构。最好利用Lucene.NET等现有工具。

答案 1 :(得分:0)

这里只是一个注释,我们有一个程序,其任务是上传超过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;
     }
   }

想到我会分享这个......