作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个具有搜索功能的 (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 转换为数组会导致高内存分配和运行不佳。
最佳答案
向用户展示成千上万的搜索结果是毫无用处的。在将结果呈现给用户之前,您应该在查询中添加“top”(Take
in linq)语句。
var results = context.Where(s => s.Contains(input)).Take(100);
如果您想向用户展示接下来的 100 个结果:
var results = context.Where(s => s.Contains(input)).Skip(100).Take(100);
所有搜索也只使用原始数组,没有嵌套 Where
因为它没有任何好处,除非您具体化查询。
关于c# - 使用嵌套 Where (LINQ) 子句优化数组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27474537/
我是一名优秀的程序员,十分优秀!