IComparable
とIComparer
インターフェースの違いは何ですか? Array.Sort()
メソッドで常にこのインターフェイスを使用する必要がありますか
名前が示すように、IComparable<T>
は読み取ります私は匹敵します。 IComparable<T>
をT
に対して定義すると、現在のインスタンスを同じタイプの別のインスタンスとcompareできます。 IComparer<T>
は読み取ります私は比較者です、私は比較します。 IComparer<T>
は、通常T
のインスタンスのスコープ外で、T
の2つのインスタンスを比較するために使用されます。
の目的は、最初は混乱する可能性があります。定義から、IComparable<T>
(クラスT
自体で定義)がソートのロジックを提供するための事実上の標準である必要があることは明らかです。 List<T>
などのデフォルトのSort
などはこれに依存しています。 T
にIComparer<T>
を実装しても、通常の並べ替えには役立ちません。その後、T
以外の他のクラスにIComparable<T>
を実装する価値はほとんどありません。この:
class MyClass : IComparable<T>
めったに意味がありません。
一方
class T : IComparable<T>
{
public int CompareTo(T other)
{
//....
}
}
それがどのように行われるべきかです。
IComparer<T>
は、カスタムルールに基づく並べ替えが必要な場合に役立ちますが、一般的な規則としては役立ちません。たとえば、Person
のクラスでは、ある時点で、年齢に基づいて人を並べ替える必要がある場合があります。その場合、次のことができます。
class Person
{
public int Age;
}
class AgeComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
return x.Age - y.Age;
}
}
AgeComparer
は、Age
に基づいてリストをソートするのに役立ちます。
var people = new Person[] { new Person { age = 23 }, new Person(){ age = 22 } };
people.Sort(p, new AgeComparer()); //person with age 22 comes first now.
同様に、T
のIComparer<T>
は意味をなしません。
class Person : IComparer<Person>
確かにこれは動作しますが、見た目が良くなく、ロジックを無効にします。
通常、必要なのはIComparable<T>
です。また、理想的には、異なる基準に基づいて複数のIComparable<T>
が可能ですが、IComparer<T>
を1つだけ持つことができます。
IComparer<T>
およびIComparable<T>
は、比較/ソートではなく、同等性のテストに使用されるIEqualityComparer<T>
およびIEquatable<T>
とまったく同じです。良いスレッド ここ 私がまったく同じ答えを書いたところ:)
私が読んだ最高の説明は、「ソートされるオブジェクトはIComparableを実装し、オブジェクトをソートするクラスはIComparerを実装します」です。 ( ソース )
並べ替えようとしているオブジェクトがIComparableを実装していない場合、IComparerを実装するクラスを作成し(比較のためにこれらのオブジェクトタイプを受け入れ)、Array.Sort()メソッドに渡す必要があります。
IComparableは、オブジェクトのデフォルトのソート順を提供するために使用されます。
IComparerは、追加の比較メカニズムを提供します。
この記事を参照してください。 http://support.Microsoft.com/kb/320727
IComparerは、指定された2つのオブジェクトを比較します。 IComparableは、他のオブジェクトと比較するために、比較されるオブジェクトによって実装されます。
オブジェクトを並べ替えるためにIComparableを実装することをお勧めします。 IComparableは、さまざまな基準による並べ替え(たとえば、オブジェクト内の選択可能なフィールドによる並べ替え)に役立ちます。
次も参照してください。 IComparable <T>とIComparer <T>を使用する場合
IComparable
を実装するクラスのインスタンスであるオブジェクトは、他のオブジェクトと比較できます。 (IComparable
を "私は比較できます。"と読みます。)これを行うこのインターフェイスのメソッドはCompareTo
です。これは、そのようなクラスのインスタンスに自分自身を他のオブジェクトと比較する方法を知りたい場合に便利です。
IComparer
を実装するクラスのインスタンスであるオブジェクトを使用して、オブジェクトのペアを比較できます。 (IComparer
を「比較できます」と読みます。)これを行うこのインターフェイスのメソッドはCompare
です。これは、比較するオブジェクトのクラスから比較ロジックを分離したい場合に便利です。オブジェクトを比較するさまざまな方法がある場合にこれを使用する1つのケース(この大文字と小文字を区別しない文字列比較)。