2011-09-12 4 views
0

사용자 지정 비교자를 작성하여 유사성을 기준으로 검색 결과 목록을 정렬하려고합니다. 입력 된 검색어가 목록에 가장 먼저 표시되고 검색 구문으로 시작하는 구문 다음에 알파 순서로 나타나는 모든 값과 같은 용어를 사용하고 싶습니다.매개 변수에 대한 사용자 지정 Comparer 오류가 발생했습니다.

을 감안할 때이 테스트 코드 :

string searchTerm = "fleas"; 
    List<string> list = new List<string> 
             { 
              "cat fleas", 
              "dog fleas", 
              "advantage fleas", 
              "my cat has fleas", 
              "fleas", 
              "fleas on my cat" 
             }; 

나는이 비교자를 사용하려고 해요 : '내 고양이는 벼룩을 가지고'에

list.Sort를 호출
public class MatchComparer : IComparer<string> 
{ 
    private readonly string _searchTerm; 

    public MatchComparer(string searchTerm) 
    { 
     _searchTerm = searchTerm; 
    } 

    public int Compare(string x, string y) 
    { 
     if (x.Equals(_searchTerm) || 
      y.Equals(_searchTerm)) 
      return 0; 

     if (x.StartsWith(_searchTerm) || 
      y.StartsWith(_searchTerm)) 
      return 0; 

     if (x.Contains(_searchTerm)) 
      return 1; 

     if (y.Contains(_searchTerm)) 
      return 1; 

     return x.CompareTo(y); 
    } 

(새 MatchComparer (SEARCHTERM) 결과를 목록 상단에

나는 이상한/이상한 일을해야한다고 생각합니다. 여기에 뭔가 잘못되었거나 내가하려는 일에 대해 더 나은 접근법이 있습니까?

고마워요!

답변

2

당신은 compareTo와

에 대한 가능한 반환 값의 전부를 사용하지 않는

-1 == 먼저 0 ==이 1 == y를 처음

당신이 원하는 동일한 X 뭔가 더 같은

public class MatchComparer : IComparer<string> 
{ 
    private readonly string _searchTerm; 

    public MatchComparer(string searchTerm) 
    { 
     _searchTerm = searchTerm; 
    } 

    public int Compare(string x, string y) 
    { 
     if (x.Equals(y)) return 0; // Both entries are equal; 
     if (x.Equals(_searchTerm)) return -1; // first string is search term so must come first 
     if (y.Equals(_searchTerm)) return 1; // second string is search term so must come first 
     if (x.StartsWith(_searchTerm)) { 
      // first string starts with search term 
      // if second string also starts with search term sort alphabetically else first string first 
      return (y.StartsWith(_searchTerm)) ? x.CompareTo(y) : -1; 
     }; 
     if (y.StartsWith(_searchTerm)) return 1; // second string starts with search term so comes first 
     if (x.Contains(_searchTerm)) { 
      // first string contains search term 
      // if second string also contains the search term sort alphabetically else first string first 
      return (y.Contains(_searchTerm)) ? x.CompareTo(y) : -1; 
     } 
     if (y.Contains(_searchTerm)) return 1; // second string contains search term so comes first 
     return x.CompareTo(y); // fall back on alphabetic 
    } 
} 
+0

그것은 작동하는 것 같습니다. 감사 ! – duckus

관련 문제