リストから名前を検索するプログラムをプログラミングしていますが、キーワードが名前の前になくても検索する必要があります (つまり、プレフィックスではないということです)。
たとえば、リストが楽器で、検索テキスト ボックスに「guit」と入力するとします。「Guitar、Guitarrón、Acoustic Guitar、Bass Guitar、...」またはこのLongdo Dictionary の検索候補の
ような
名前が見つかるはずです。
これが私の単純で愚かなアルゴリズムです(それが私ができるすべてです)
const int SEARCHROWLIMIT = 30;
private string[] DoSearch(string Input, string[] ListToSearch)
{
List<string> FoundNames = new List<string>();
int max = 0;
bool over = false;
for (int k = 0; !over; k++)
{
foreach (string item in ListToSearch)
{
max = (max > item.Length) ? max : item.Length;
if (k > item.Length) continue;
if (k >= max) { over = true; break; }
if (!Input.Equals("Search")
&& item.Substring(k, item.Length - k).StartsWith(Input, StringComparison.OrdinalIgnoreCase))
{
bool exist = false;
int i = 0;
while (!exist && i < FoundNames.Count)
{
if (item.Equals(FoundNames[i]))
{
exist = true;
break;
}
i++;
}
if (!exist && FoundNames.Count < SEARCHROWLIMIT)
FoundNames.Add(item);
else if (FoundNames.Count >= SEARCHROWLIMIT) over = true;
}
}
}
return FoundNames.ToArray();
}
このアルゴリズムは多数の名前に対して遅すぎると思います。試行錯誤を繰り返した結果、操作を中断するために SEARCHROWLIMIT を追加することにしました。
もう 1 つの問題は、弦楽器、パーカッションなどのカテゴリと原産国で楽器を検索する必要があることです。そのため、タイプと国によるフィルターでそれらを検索する必要があります。
どうすればこれを達成できますか?