0

ユーザーが入力したテキストの一部のみを使用して、テキストボックスにオートコンプリート機能を実装したいと考えています。たとえば、ユーザーが「123 abc」と入力した場合、「abc」の部分だけでオートコンプリートが機能するようにします。

ハッシュセットにデータを入力しようとしました (500,000 項目以上)。次に、正規表現を使用し@"^[\d]*\s*"て文字列の先頭から数字とスペースを正常に削除するため、「abc」のみが残ります(ただし、テキストボックスに数字を残したいvalue.StartsWith("abc")。ハッシュセット。最後に、フィルター処理されたすべてのアイテムをコンボ ボックスのアイテムに追加します。

このメソッドは非常に遅く、最大 5 秒以上の一時停止が発生します。テキスト ボックスのオートコンプリート メソッドは、はるかに高速で、より適切に実装されています。文字列の一部のみでテキストボックスのオートコンプリートを使用できますか、それとも同様に高速であると提案できる他の実装がありますか?

4

1 に答える 1

0

二分探索法を試したり検討したりしましたか? それはかなり速いかもしれません...

以下のコードが示すように、それらをすべてリストに追加し、並べ替えてから検索で使用するだけです...

別の方法は、テキストのインデックス作成を使用して非常に高速なインデックス付きデータベースに格納することです。

例えば...

List.BinarySearch は、完全一致が見つからない場合、リクエストよりも大きい次のアイテムのインデックスの 1 の補数を返します。

//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);
        }
    }
}
于 2012-10-06T19:29:22.907 に答える