2017-02-06 14 views
-2

文字列とアルファベット順の並べ替えられたリストを返すComparerを書きたいと思います。 これは私のリストである:ここでComparerを文字列で含む特定の並べ替えとアルファベット順の並べ替え

AA 
AA MN 
ADIDAS 
ADIDAS MEN 
2KC 
ISANA MEN 

は私の比較演算子です:

public class MyComparer : IComparer<string> 
{ 
    int IComparer<string>.Compare(string x, string y) 
    { 
     if (x == y) 
     { 
      return 0; 
     } 
     if (x.Contains(y)) 
     { 
      return -1; 
     } 
     else 
     { 
      return 1; 
     } 
    } 
} 

そして、この比較子そのようなソート私のリスト:

2KC 
ADIDAS MEN 
AA MEN 
AA 
ISANA MEN 
ADIDAS 

私は最初のチェックは、「最長たいので、それは正しいです"ブランド(製品でブランドを見つけることでエラーを取り除く)が、このソートではアルファベット順にソートしたい。だから私のリストは次のようになります

2KC 
ADIDAS MEN 
AA MEN 
AA 
ADIDAS 
ISANA MEN 

私はstring.Sort()で試行していますが正しく動作しません。

+3

あなたのコンペラーは、完全に予期しないチェックがあります。x.Contains(y)。それはどういう意味ですか、なぜあなたはそれをこのように必要としますか? – eocron

+0

それは私のリストの一部です。私はOrderByを使い、パラメータの一つにComparerが必要です。 'MEN'のようなオプションのsufixで最初のブランドをチェックしたいので、このようにする必要があります。他にも「ベルベット」と「ブルジョワ」があります。この比較器では、結果配列には最初に「ベルベット」、次に「ブルジョワス」があります。それは間違っています。 – Sidron

+0

"ADIDAS MEN"を "ADIDAS"の前にソートする理由を理解していますが、なぜ "AA"と "AA MEN"の前にソートするのか分かりません。まさにあなたの選別ルールは何ですか? –

答えて

1

あなたには2つの問題があります。最初は、あなたの比較者がIComparer.Compareのルールに違反していることです。規則では、A.CompareTo(B)が1を返した場合、B.CompareTo(A)は-1を返さなければならないと言います。あなたの比較人はそれをしません。たとえば、次のコード:

string a = "abc"; 
string b = "def"; 
MyComparer comp = new MyComparer(); 

int rsltab = comp.Compare(a, b); // returns 1 
int rsltba = comp.Compare(b, a); // returns 1 

これは明らかに間違っています。あなたは比較演算で行う他にどのような

、あなたはことを確認する必要があります

  1. x.Compare(y)場合は-1を返し、その後、y.Compare(x)戻り1.
  2. その後、y.Compare(x) -1を返し、x.Compare(y) 1を返します。
  3. x.Compare(y)あれば0を返す、その後y.Compare(x)戻り0

比較の規則の詳細については、ICompareble.CompareToのドキュメントの「実装者への注記」セクションを参照してください。私は、この情報がIComparer<T>のドキュメントで繰り返されていないことに驚いています。

他の問題は、私はあなたが本当にxyが含まれているかどうかを確認するためにテストしたいとは思わないということです。場合によってはxyで始まるかどうかをチェックしたいと思うかもしれません。つまり、

if (x.StartsWith(y)) return 1; 

しかし、それもあなたに奇妙な結果を与える可能性があります。たとえば、ある企業の名前が他の会社の最初の単語の接頭辞にすぎない場合はどうなりますか?例:

Art 
Artificial Flavor Company 

Artificial Flavor Companyは、Artとの関係がないのに、Artificial Flavor Companyを実際に分類してほしいですか?

本当に望むのは、文字列を解析し、長い文字列の最初の単語が短い文字列と等しいかどうかを確認することです。だから "ADIDAS"と "ADIDAS MEN"を与えれば、長い文字列を解析して最初の単語を取得し、それを短い文字列と比較します。それは完璧な解決策ではありませんが、あなたの現在のものよりはるかに効果的です。

+0

どうもありがとう、助けてくれてありがとうございました:)はい、私は最初に長いブランドをチェックしてから短くします。ブランドをブランドに分類してエラーを排除します。しかし、私が言ったように、より多くのブランドがあり、例えば、含まれていない(悪い)という単語がランダムにソートされている単語があります。最初の文字に「B」が付いた単語は、「V」の別の単語よりも遠い – Sidron

関連する問題