Я программирую программу для поиска имени из списка, и мне нужно найти их, даже если ключевое слово не находится перед именами (вот что я имею в виду non-prefix)Как выполнить поиск из списка с не префиксными ключевыми словами
eg если я мой список музыкальных инструментов, и я печатаю «guit» в текстовое поле поиска.
Он должен найти имена «гитары, гитаррон, акустическую гитару, бас-гитару, ...»
или что-то вроде этого Longdo Dictionary's поиска предложения.
вот мой простой и глупый алгоритм (это все, что я могу сделать)
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 для разрыва операции И я также думаю, что есть некоторые готовые методы, которые могут это сделать.
И еще одна проблема в том, что мне нужно искать музыкальные инструменты по категориям, например, строк, перкуссий, ... и страны происхождения. Поэтому мне нужно искать их с фильтром по типу и стране.
Как я могу это достичь?
В ваших примерах приведены только случаи, когда поисковый запрос находится в начале слова. Что делать, если он находится в середине слова, например, поиск «xyz» из таких терминов, как 'abcxyzdef'? –