2016-07-16 13 views
1

私はIComparableを使用しようとしましたが、調査しましたが、なぜこれが機能しないのかわかりません。 文字列とintを比較したいのですが、ICompareableインターフェイスを使用してGenericのタイプでcompareToを実行する方法を理解できません。Genericの文字列とintを比較する方法C#

ジェネリックスを処理するためにCompareToを実装するにはどうすればよいですか?

public class QuickSort : IComparable 
{ 
    public static int Partition<T>(ref T[] arr, int lo, int hi) 
    { 
     int i = lo + 1; 
     int j = hi; 
     while (j > i) 
     { 
      while (arr[i].) // <- Cannot apply CompareTo 
       i++; 
      while (arr[j] > arr[lo]) 
       j--; 

      Swap(ref arr[i], ref arr[j]); 
     } 

     Swap(ref arr[lo], ref arr[j]); 

     return j; 

     } 
} 
+0

フィリップ、答えのいずれかが役に立ちましたか? – Andrew

+0

@Andrewええ、彼らは大いに助けました! – FillyPajo

答えて

3

Tを比較できるように指定する必要があります。コンパイラは、その型を予期しないと知ることはできません。この方法は、あなたは両方のあなたの条件のためにCompareToを使用することができます。

public class QuickSort 
{ 
    public static int Partition<T>(T[] arr, int lo, int hi) where T : IComparable 
    { 
     int i = lo + 1; 
     int j = hi; 
     while (j > i) 
     { 
      while (arr[i].CompareTo(arr[lo]) == 0) 
       i++; 
      while (arr[j].CompareTo(arr[lo]) > 0) // means arr[j] > arr[lo] 
       j--; 

      Swap(ref arr[i], ref arr[j]); 
     } 

     Swap(ref arr[lo], ref arr[j]); 

     return j; 
    } 
} 

また、私はあなたが別のQuickSortのインスタンスを比較したいとは思わないので、私はそのインターフェイスを削除しました。

更新:Hawkmooonさんのコメントに基づいて、私はあなたの方法で第二を見ていたし、その署名がさらにシンプルにすることができます考えた:

public static int Partition(IComparable[] arr, int lo, int hi) 
    { 
     int i = lo + 1; 
     int j = hi; 
     while (j > i) 
     { 
      while (arr[i].CompareTo(arr[lo]) == 0) 
       i++; 
      while (arr[j].CompareTo(arr[lo]) > 0) 
       j--; 

      Swap(ref arr[i], ref arr[j]); 
     } 

     Swap(ref arr[lo], ref arr[j]); 

     return j; 
    } 

私はあなたのコードは何かが足りないかもしれないと思います。ちょうどその場合、here you have a full C# example of a working quicksort method

+1

すばらしい答え。 arrが渡される方法に関係なく、配列メンバを変更できるので、 "arr"パラメータを "ref"にする必要はありません。 – Hawkmooon

0

あなたは明示的TIComparableを実装することを指定する必要があります。そのように見えるためにあなたの方法の宣言を変更します。

public static int Partition<T>(ref T[] arr, int lo, int hi) where T : IComparable 

また、あなたがarr[i] > arr[j]のようなあなたのアイテムを比較することはできません。あなたはCompareTo()を呼び出し、それがゼロ、より多くのだかどうかを確認、ゼロまたはゼロに等しい少ないし、する必要があります。

while(arr[i].CompareTo(arr[high]) > 0) 

(その意志はあなたのケースでそのarr[i] > arr[high]を意味します。)

そして、最も可能性の高いあなたがする必要はありませんQuickSortクラスにIComparableを実装します。 IComparableは、コンパレータクラス自体ではなく、比較される項目に対して実装する必要があります。

+0

インタフェースを使用することを宣言する場合は、CompareToを自分で実装する必要がありますか? – FillyPajo

+0

しかし、あなたは本当に 'QuickSort'のインスタンスを比較したいですか?私は非常にそれを疑う。インターフェイスを追加する場合はもちろん、CompareToメソッドを実装する必要があります。それ以外の場合はコンパイルされません。 – Andrew

+0

'IComparable'インターフェースを継承している文字列、整数、その​​他のクラスを扱う場合、' CompareTo() 'を実装する必要はありません。独自のアイテム 'MyItem'の配列を扱う場合は、(QuickSortクラス自体ではなく)比較するアイテムに直接IComparableインターフェースを実装したいでしょう。 –