在制作智能感知/自动完成列表时,过滤字符串列表的最快方法是什么?

6 .net c# linq wpf intellisense

我正在编写一个Intellisense/Autocomplete,就像你在Visual Studio中找到的那样.直到列表中包含2000多个项目时才会好起来.

我正在使用一个简单的LINQ语句来进行过滤:

var filterCollection = from s in listCollection
                       where s.FilterValue.IndexOf(currentWord,     
                       StringComparison.OrdinalIgnoreCase) >= 0
                       orderby s.FilterValue
                       select s;
Run Code Online (Sandbox Code Playgroud)

然后我将此集合分配给WPF Listbox的ItemSource,这就是它的结束,工作正常.

注意到,Listbox也是虚拟化的,因此在内存和可视树中最多只有7-8个可视元素.

然而,需要注意的现在的问题是,当用户键入速度极快的RichTextBox中,并在每一个关键了,我执行过滤+结合,有这个半竞争状态,或不同步过滤,像第一个关键笔划的滤波的可能仍在做它的过滤或绑定工作,而第四个关键的中风也在做同样的事情.

我知道在应用过滤器之前我可能会延迟,但我正在尝试实现无缝过滤,就像在Visual Studio中一样.

我不确定我的问题究竟在哪里,所以我也将它归因于IndexOf的字符串操作,或者我的字符串列表可以在某种索引中进行优化,这可以加快搜索速度.

任何代码示例的建议都受到欢迎.

谢谢.

Mic*_*eyn 1

我建议尝试将结果集限制在一定数量的项目上,看看问题是否消失。也就是说,您可能有 5000 个可供选择,但尝试返回不超过 100 个,即使更多匹配。说:

var filterCollection = (from s in listCollection
  where s.FilterValue.IndexOf(currentWord,StringComparison.OrdinalIgnoreCase)>=0
  orderby s.FilterValue
  select s).Take(100);
Run Code Online (Sandbox Code Playgroud)

如果您的问题消失了,则速度减慢可能是由于为列表框返回的项目太多而导致的。我不确定问题是否会消失,因为 ListBox 是虚拟化的,但值得一试。您也可以尝试同样的操作,但在排序(即 orderby)之前将过滤结果限制为 100 个项目,看看是否有帮助。无论如何,按以下顺序执行会更有效:

var filterCollection = (from s in listCollection
  where s.FilterValue.IndexOf(currentWord,StringComparison.OrdinalIgnoreCase)>=0
  select s).Take(100)
           .OrderBy(s => s.FilterValue);
Run Code Online (Sandbox Code Playgroud)

底线是确定问题是否是返回并分配给 filterCollection 的项目数或初始项目数或两者的函数。