C#中的字符串列表中的高性能“包含”搜索

我有一个大约的列表。 500,000个字符串,每个约。 100个字符长。 给定搜索词,我想识别列表中包含搜索词的所有字符串。 目前,我使用Select方法(“MATCH%term%”)使用普通旧数据集执行此操作。 这在我的笔记本电脑上大约需要600毫秒。 我想让它更快,也许100-200ms。

什么是推荐的方法?

性能至关重要,因此我可以在必要时(在合理范围内)交换内存占用以获得更好的性能 一旦初始化,字符串列表就不会改变,因此计算哈希值也是一种选择。

有没有人有推荐,哪种C#数据结构最适合这项任务?

在执行快速全文搜索时,我听说过Lucene.NET的好消息。 他们已经完成了找出最快的数据结构等工作。 我建议给那个镜头。

否则,您可能会尝试这样的事情:

var matches = list.AsParallel().Where(s => s.Contains(searchTerm)).ToList(); 

但它可能不会让你下降到100毫秒。

trie或后缀树有助于加快速度 – 这实际上是全文搜索(通常)正在使用的。

您可以使用C#中的实现,也可以看到这个SO线程: 在C#中寻找后缀树实现?

另外正如@leppie所提到的,并行执行可能已经为您提供了所需的x3性能增益。 但话又说回来,你必须仔细测量,没有它,这是任何人的猜测。

您是否尝试将字符串加载到List ,然后使用Linq扩展Contains方法?

 var myList = new List(); //Code to load your list goes here... var searchTerm = "find this"; var match = myList.Contains(searchTerm); 

你试过以下吗?

 list.FindAll(x => x.Contains("YourTerm")).ToList(); 

出于某种原因,List.AsParallel()。Where(…)比我的PC上的list.FindAll(…)慢。

 list.AsParallel().Where(x => x.Contains("YourTerm")).ToList(); 

希望这会帮助你。

 public static bool ContainsFast(this IList list, T item) { return list.IndexOf(item) >= 0; } 

基于我所做的测试, Contains这种变化在我身边快了大约33%。

您应该尝试使用Dictionary类。 它比List快得多,因为它是一个索引搜索。

 Dictionary ldapDocument = new Dictionary(); //load your list here //Sample -> ldapDocument.Add("014548787","014548787"); var match = ldapDocument.ContainsKey(stringToMatch);