我想在文本框中仅使用用户输入的部分文本来实现自动完成功能。例如,如果用户输入“123 abc”,我希望自动完成功能只与“abc”部分一起使用。
我尝试用数据填充哈希集(超过500,000项)。然后使用正则表达式@"^[\d]*\s*"
成功删除字符串开头的数字和空格,这样我只剩下“abc”(但我想将数字保留在文本框中)然后通过迭代hashset中的每个值,使用value.StartsWith("abc")
填充列表。最后,我将所有过滤的项目添加到组合框项目中。
这种方法非常慢,让我暂停最多5秒或更长时间,文本框自动完成方法更快更好实现。我是否可以仅使用字符串的一部分来使用文本框自动完成功能,还是可以建议其他一些同样快速的实现?
答案 0 :(得分:0)
您是否尝试/考虑过二元搜索方法?它可能会快得多......
您只需将它们全部添加到列表中,然后对其进行排序,然后在搜索中使用它,如下面的代码所示......
另一种方法是将其存储在索引数据库中,使用文本索引可以非常快速地存储。
例如......
如果找不到完全匹配,List.BinarySearch将返回大于请求的下一项索引的补码。
//So, you can do it like this (assuming you'll never get an exact match):
var key = (cardName + Config.EditionShortToLong(edition)).ToLower();
var list = CardBase.cardList;
var index = ~list.BinarySearch(key);
return index != list.Count && list[index].StartsWith(key);
祝你好运......
http://msdn.microsoft.com/en-us/library/w4e7fxsh.aspx
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
List<string> dinosaurs = new List<string>();
dinosaurs.Add("Pachycephalosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus");
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nSort");
dinosaurs.Sort();
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");
int index = dinosaurs.BinarySearch("Coelophysis");
if (index < 0)
{
dinosaurs.Insert(~index, "Coelophysis");
}
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");
index = dinosaurs.BinarySearch("Tyrannosaurus");
if (index < 0)
{
dinosaurs.Insert(~index, "Tyrannosaurus");
}
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
}
}