2010-04-10 2 views
3

목록에서 이름을 검색하는 프로그램을 프로그래밍 중이며 키워드가 이름 앞에 없더라도 찾을 필요가 있습니다. 비 접두어)접두어가 아닌 키워드를 사용하여 목록에서 검색하는 방법

예 : 내 목록이 음악 악기 인 경우이고 검색 텍스트 상자에 "guit"을 입력합니다.
그것은 이름 "기타, Guitarrón, 어쿠스틱 기타,베이스 기타, ..."
또는이 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

예제는 검색어가 단어의 시작 부분에있는 경우에만 제공됩니다. 'abcxyzdef'와 같은 용어에서'xyz'를 검색하는 것과 같이 단어 중간에 있다면 어떨까요? –

답변

6

:

제품의 세트가 합리적으로 작은 경우
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

조심하십시오. 분명히 DB를 reccomending 것은 인정하지 않습니다! – spender

2

한 단어. 데이터 베이스!

이러한 모든 다른 검색을 수행하려면 심각하게도 분류 문제를 단순화하는 스키마로 데이터를 데이터베이스에 배치하는 것이 좋습니다. Sql Server Express는 이제 수행하려고하는 검색 종류에 매우 유용 할 full text search을 지원합니다.

Linq-to-SQL에서 FTS를 사용하는 것에 대한 좋은 블로그 게시물 here이 있습니다. 이 같은 코드를 작성할 수 LINQ를 사용

+1

좋습니다. 설명이없는 Downvote. 왜? – 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", "데프 ABC", "XYZ"

"ABC"에 대한 검색 데프 ""ABCDEF "찾을 것 abc "이지만"defabc "는 아닙니다.

+0

모든 답변에 많은 감사드립니다. 이제 알고리즘을 발명하지 않고 최고의 검색을 찾았습니다. – anuith

관련 문제