2010-04-15 6 views
2

my post에서 요청한 정보, 이름, 범주 및 출처가있는 음악 계측기에 대한 검색을 수행하고 싶습니다.대부분의 유사성/동등한 방법으로 linq 결과를 정렬하는 방법

하지만 이제 정렬/유사성/동등성에 의한 결과를 같은 키워드로 그룹화하고 싶습니다. 나는 목록이있는 경우

{드럼, 그랜드 피아노, 기타, Guitarrón, 하프, 피아노} < < 이름

으로 분류 내가 쿼리 경우 "P"결과가 {피아노해야한다, 그랜드 피아노, 하프}
하지만 때문에 소스 목록의 순서의 첫 번째 하프를 보여줍니다

나는 목록 및 쿼리 "피아노"에 {그랜드 피아노}를 추가하는 경우
결과는 {피아노, 그랜드 피아노}처럼 갈까요
또는 "기타"쿼리 그것은해야한다 {기타, Guitarrón}

여기 내 코드

static IEnumerable<MInstrument> InstrumentsSearch(IEnumerable<MInstrument> InstrumentsList, string query, MInstrument.Category[] SelectedCategories, MInstrument.Origin[] SelectedOrigins) 
{ 
    var result = InstrumentsList 
     .Where(item => SelectedCategories.Contains(item.category)) 
     .Where(item => SelectedOrigins.Contains(item.origin)) 
     .Where(item => 
      { 
       if (
         (" " + item.Name.ToLower()).Contains(" " + query.ToLower()) 
         || item.Name.IndexOf(query) != -1 
        ) 
       { 
        return true; 
       } 
       return false; 
      } 
     ) 
     .Take(30); 

    return result.ToList<MInstrument>(); 
} 

의 또는 결과가 내가 "선두로부터의 명령으로"라는 my old self-invented algorithm, 나에게 단지 OK입니다
처럼 될 수있다.

그리고 할 일은 이름, 카테고리 또는 출처를 검색해야합니다.
"이탈리아"라고 입력하면 이탈리아에서 피아노 등을 찾을 수 있습니다.
또는 "string"을 입력하면 기타를 찾아야합니다.

그런 일을 할 수있는 방법이 있습니까?

미리 감사드립니다. 전체에 퍼지 경기가 가장 좋은 것입니다,하지만 당신은의 비율에 따라 경기를 정량화하여 시작할 수 있습니다 - StringSimilarityScore의 정의에 관해서는

result = InstrumentsList. 
    .Where(...) 
    .OrderByDescending(instrument => 
     StringSimilarityScore(instrument.Name, searchString)) 
    .Take(30); 

-

+0

왜이 커뮤니티는 위키입니까? 그것은해서는 안됩니다. –

+0

죄송합니다. 저는 여기에서 새로 생겼습니다. 커뮤니티 위키가 무엇인지 모르고 우연히 검사했을 수도 있습니다. (실제로 확인 된 것은 아닙니다!). 이제 커뮤니티가 무엇인지 읽고 있습니다. 죄송합니다. – anuith

답변

5

당신은 OrderBy/OrderByDescending을 원한다 검색 문자열과 일치 이름 :

double StringSimilarityScore(string name, string searchString) 
{ 
    if (name.Contains(searchString)) 
    { 
     return (double)searchString.Length/(double)name.Length; 
    } 

    return 0; 
} 

그런 다음 하나의 문자가 지정되어있는 경우의 이름에서 검색 문자열의 위치를 ​​(이전이 더 좋다), 고려할 수 있습니다 -하지만 난거야 저것까지 남겨주세요. 너. :-)

관련 문제