从.NET中的10000项自动完成

从.NET中的10000项自动完成,.net,.net,我在内存中收集了大约10K个对象。我想让用户能够键入项目名称或描述的一部分,并显示一个自动完成列表。什么是有效的方法?我真的需要尽可能快的响应时间,用户非常快 非常感谢, Mary将您的数据整理为一个整体 最快的方法是在页面中删除这些值,例如在javascript变量(字符串数组)中,使用文本控件,然后使用如下内容: 1万个物体其实并不多 下面的内容就足够了 foreach(cItem Item in ItemList) { if(regex.match(Item.Name, "exp

我在内存中收集了大约10K个对象。我想让用户能够键入项目名称或描述的一部分,并显示一个自动完成列表。什么是有效的方法?我真的需要尽可能快的响应时间,用户非常快

非常感谢, Mary

将您的数据整理为一个整体


最快的方法是在页面中删除这些值,例如在javascript变量(字符串数组)中,使用文本控件,然后使用如下内容:


1万个物体其实并不多

下面的内容就足够了

foreach(cItem Item in ItemList)
{
     if(regex.match(Item.Name, "expression"))
         //Add Item to autocomplete results;


         //Break if more than 10 matches

}



for(i = 0; i < 10 && i < autocomplete_results.Length; ++i)
{
          // display first 10 matches
}
foreach(项目列表中的cItem项目)
{
if(regex.match(Item.Name,“表达式”))
//添加项目以自动完成结果;
//如果超过10个匹配项,则中断
}
对于(i=0;i<10&&i
通常,您不想给用户所有可能的选择—例如,如果项目列表是一组名称,则键入字母“E”并在下拉列表中获取每个名称中的E,对用户来说既不高效也不快速。您是否考虑过仅在用户键入3个(或更多)字符时才建议结果

如果项目集是静态的,这将(可能)允许您为每个唯一的3或4字符集预先计算项目集,并将它们存储在列表字典中,类似于:

Dictionary<String, List<Item>> itemsByKey;
Dictionary itemsByKey;

您可以使用Trie数据结构(或前缀树)保存项目名称。请参阅wikipedia上非常详细的内容,其中描述了此数据结构的原理,并提供了一些基准测试结果

Trie的每个节点都可以实现为与单个数据字符串中的第N个位置相对应的字符的排序列表,其中N是节点的深度。然后,您可以使用来高效地执行数据查找

要使其在您的情况下工作,只需将最后一个节点保持与先前输入的前缀相对应。当用户键入下一个字母时,只需搜索对应的直接子字母


相应子树中的所有内容都可能匹配,因此可以提供给用户。为了使自动完成更智能,您可以跟踪单个数据项的频率,并仅显示最频繁的数据项。

这不是一个特定于.net的答案,但是解决这个问题的通常方法是创建一个索引并预先计算自动完成列表,这些列表存储在一个层次化的映射中,映射的映射是…的映射,映射的列表结构(见下文)。它基本上是一个trie的实现

基本上,您有一个hash映射(真正的hash映射,带有O(1)实现),其中键是可能的子字符串。对于每个键字符串“XYZ”,它指向一个包含包含“XYZ”的所有对象的数据的映射;使用“XYZA”、“XYZB”等键。。。然后,一旦到达N个字符(N个映射深度),最后一个映射值就是集合中包含该N个字符字符串的所有实际对象的列表

然后检查集合,并为每个对象计算长度为M到N的所有可能的子字符串(我假设您只想在键入>=M个字符时自动完成;太长的子字符串是无用的)并填充映射

数据结构如下:

TopMap => {
          'A' => Map_for_A
          'B' => Map_for_B
              ...
          }

Map_For_A => {
          'AA' => Map_for_AA
          'AB' => Map_for_AB
              ...
          }
Map_For_AB => {
          'ABC' => Map_for_ABC
          'ABD' => Map_for_ABD
              ...
          }
Map_For_ABD => {
          'ABDE' => List_For_ABDE
          'ABDX' => List_For_ABDX
          }

你没有说你正在使用哪个用户界面。如果您使用的是ASP.NET Web表单,则可以使用AjaxControlToolkit中的自动完成控件


您可以在这里找到一个演示:

构建UI时使用了什么?Windows窗体,WPF,来自ASP.Net的web应用程序?它是ASP MVC应用程序,一个网页将从controller.jQuery请求keypress JSONP,以获取标记为
.Net
?嗯…是吗?为什么不呢?从未在ASP.NET项目中使用过jquery?特别是,如果需要全文搜索,则使用后缀树:或者在标题中的“自动完成”一词中使用@Chris:,我假设用户总是从描述的开头开始键入。但这很好知道,我其实不知道尝试也可以用于全文搜索!