我正在创建一个具有搜索功能的(C#)工具。这种搜索类似于“到任何地方”搜索(就像ReSharper或VS2013中一样)。
搜索上下文是一个包含所有项的字符串数组:
当用户搜索"ca"时,我尝试使用之前的结果作为搜索上下文,但这会导致(我认为?)嵌套的Where迭代,并且运行效果不佳。可以考虑类似以下代码的解决方案:
搜索上下文是一个包含所有项的字符串数组:
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
更有效吗? - Tim SchmelterToArray
吗?如果列表很大,使用ToList
可能更有效率,因为倍增算法只需要找到大于或等于项数的大小,而数组必须具有正确的大小。但那不是我的重点。 - Tim Schmelter