c#自动完成文本框仅使用部分输入文本

时间:2012-10-06 19:02:18

标签: c# autocomplete

我想在文本框中仅使用用户输入的部分文本来实现自动完成功能。例如,如果用户输入“123 abc”,我希望自动完成功能只与“abc”部分一起使用。

我尝试用数据填充哈希集(超过500,000项)。然后使用正则表达式@"^[\d]*\s*"成功删除字符串开头的数字和空格,这样我只剩下“abc”(但我想将数字保留在文本框中)然后通过迭代hashset中的每个值,使用value.StartsWith("abc")填充列表。最后,我将所有过滤的项目添加到组合框项目中。

这种方法非常慢,让我暂停最多5秒或更长时间,文本框自动完成方法更快更好实现。我是否可以仅使用字符串的一部分来使用文本框自动完成功能,还是可以建议其他一些同样快速的实现?

1 个答案:

答案 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);
        }
    }
}