2010-04-10 1 views
3

Я программирую программу для поиска имени из списка, и мне нужно найти их, даже если ключевое слово не находится перед именами (вот что я имею в виду 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 для разрыва операции И я также думаю, что есть некоторые готовые методы, которые могут это сделать.

И еще одна проблема в том, что мне нужно искать музыкальные инструменты по категориям, например, строк, перкуссий, ... и страны происхождения. Поэтому мне нужно искать их с фильтром по типу и стране.

Как я могу это достичь?

+0

В ваших примерах приведены только случаи, когда поисковый запрос находится в начале слова. Что делать, если он находится в середине слова, например, поиск «xyz» из таких терминов, как 'abcxyzdef'? –

ответ

6

Использование LINQ можно написать такой код:

var resultSet = products 

    // filter products by category 
    .Where(product => product.Category == "strings") 

    // filter products by origin 
    .Where(product => product.Origin == "italy") 

    // filter products whose name contains a word starting with "guit" 
    .Where(product => (" " + product.Name).Contains(" guit")) 

    // limit the result set to the first 30 matching products 
    .Take(30); 

Если наборы продуктов достаточно мал, вы можете использовать LINQ к объектам. В противном случае вы должны использовать базу данных и посмотреть LINQ-to-SQL.

+0

Будьте осторожны. По-видимому, рекомендовать БД не оценили! – spender

2

Одно слово. База данных!

Серьезно, если вы хотите сделать все эти разные поисковые запросы, подумайте о том, чтобы разместить свои данные в базе данных со схемой, которая упрощает проблемы с категорией, которые у вас есть. Sql Server Express теперь поддерживает full text search, что было бы очень полезно для поиска, который вы пытаетесь выполнить.

Существует хорошее сообщение в блоге here об использовании FTS с Linq-to-Sql.

+1

Отлично. До нисходящего потока без объяснений. Зачем? – spender

0
static List<string> GetItemsWithWordsStartingWithSubstring(List<string> list, string substring) 
{ 
    var query = from str in list 
       from item in str.Split(' ') 
       where item.StartsWith(substring, StringComparison.InvariantCultureIgnoreCase) 
       select str; 

    return query.ToList(); 
} 

Надеюсь, я правильно прочитал ваш интимный вопрос. Эта функция вернет любой элемент из списка, который содержит слово, начинающееся с вашей подстроки. К параметрам разделения может быть добавлена ​​дополнительная пунктуация. Учитывая список со следующим содержанием:

"ABCDEF", "defabc", "Защита а", "хуг"

Поиска по "Азбуке" найти "ABCDEF" и «Защита abc ", но не" defabc ".

+0

Большое спасибо за ответы. сейчас я нашел лучший поиск, не изобретая никаких алгоритмов. – anuith