【发布时间】:2014-12-14 21:49:40
【问题描述】:
我正在创建一个具有搜索功能的 (C#) 工具。该搜索有点类似于“去任何地方”搜索(如 ReSharper 或 VS2013)。
搜索上下文是一个字符串数组,包含前面的所有项目:
private string[] context; // contains thousands of elements
搜索是增量的,并且随着用户提供的每个新输入(字符)发生。
我已经使用 LINQ Where 扩展方法实现了搜索:
// User searched for "c"
var input = "c";
var results = context.Where(s => s.Contains(input));
当用户搜索“ca”时,我尝试使用以前的结果作为搜索上下文,但这会导致(我认为?)嵌套的 Where 迭代,并且运行得不是很好。想想类似这样的代码:
// Cache these results.
var results = var results = context.Where(s => s.Contains(input));
// Next search uses the previous search results
var newResults = results.Where(s => s.Contains(input));
有没有办法优化这个场景?
每次搜索都将 IEnumerable 转换为数组会导致高内存分配并且运行不佳。
【问题讨论】:
-
您可以使用
ToList实现中间结果。但这真的比每次都使用context更有效吗? -
ToList 比 ToArray 好吗?
-
您没有使用
ToArray吗?如果列表很大,ToList会更有效,因为加倍算法只需要找到大于或等于项目计数的大小,而数组必须具有正确的大小。但这不是我的意思。 -
这听起来像是Rx 的完美用例,我已经在多个示例和教程中看到过这种情况,如果我找到一个我会发布它或围绕它写一个答案。
-
考虑使用智能字符串搜索算法,随着输入字符串的增长和模式数量的增加,性能可能会显着下降。例如,Aho-Corasick 或 Rabin-Karp
标签: c# .net performance linq linq-to-objects