2011-09-12 12 views
0

私は類似比較に基づいて検索結果のリストを並べ替えるカスタム比較者を作成しようとしています。私は入力された検索語のような言葉がリストの最初に表示され、その後に検索フレーズで始まるフレーズ、アルファオーダーの他のすべての値が続きます。パラメータに対するCustom 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" 
             }; 

を: '私の猫がノミを持っている' に

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); 
    } 

ははlist.sort(新しいMatchComparer(検索語)の結果を呼び出します

私はここで何か奇妙な/奇妙なことをしているに違いないと思う。ここに何か間違っているか、私がやろうとしていることに対してより良いアプローチがあるのだろうか?

ありがとうございます!

答えて

2

あなたがのCompareTo

のための可能な戻り値のすべてを使用していない-1 == X最初 0 ==は、あなたがより多くのこのような何かをしたい 1 == yの最初の

等しいです

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

関連する問題