62

IComparableIComparerインターフェイスの違いは何ですか? Array.Sort()メソッドで常にこのインターフェイスを使用する必要がありますか

4

6 に答える 6

105

名前が示すように、IComparable<T>は比較可能です. IComparable<T>を定義すると、現在のインスタンスを同じタイプの別のインスタンスと比較Tできます。私は比較者です、私は比較します. 通常は のインスタンスの範囲外にある の2 つのインスタンスを比較するために使用されます。IComparer<T>IComparer<T>TT

それらが何のためにあるかについては、最初は混乱する可能性があります。定義から、したがってIComparable<T>(クラスT自体で定義されている) が並べ替えのロジックを提供するためのデファクト スタンダードであることは明らかです。etcのデフォルトSortList<T>これに依存しています。IComparer<T>on を実装しTても、通常の並べ替えには役立ちません。IComparable<T>その後、以外のクラスに実装する価値はほとんどありません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.

同様IComparer<T>に onTは意味がありません。

class Person : IComparer<Person>

確かにこれは機能しますが、目には良くなく、論理を無効にします。

通常、必要なのはIComparable<T>. また、理想的には、異なる基準に基づいてIComparable<T>複数が可能ですが、1 つだけを持つことができます。IComparer<T>

IComparer<T>andは、比較/ソートではなく等しいかどうかをテストするために使用されるand とIComparable<T>まったく同じです。ここで私がまったく同じ答えを書いた良いスレッド:)IEqualityComparer<T>IEquatable<T>

于 2012-12-06T18:38:54.633 に答える
42
  • IComparable-同じタイプの別のオブジェクトを取得し、現在のオブジェクトを渡されたオブジェクトと比較するCompareTo()メソッドを使用してオブジェクトのインターフェイスを定義します。これは、オブジェクトとの比較を内部化し、よりインラインの比較操作を可能にし、あるタイプのオブジェクトを比較するための論理的な方法が1つしかない場合、または圧倒的に一般的なデフォルトの方法がある場合に役立ちます。
  • IComparer-別のタイプの2つのオブジェクト(IComparableを実装する必要はありません)を取得してそれらを比較するCompare()メソッドを使用してインターフェイスを定義します。これは比較を外部化し、型の2つのオブジェクトを比較するための実行可能な方法が多数ある場合、または型がIComparableを実装していない場合(またはIComparableの実装が必要な方法とは異なる方法を比較している場合)に役立ちます。そのタイプのソースを制御できます。
于 2011-05-12T15:56:24.583 に答える
16

私が読んだ最も良い説明は、「ソートされるオブジェクトはIComparableを実装し、オブジェクトをソートしようとするクラスはIComparerを実装する」です。(ソース

並べ替えようとしているオブジェクトがIComparableを実装していない場合は、IComparerを実装する(そして比較のためにそれらのオブジェクトタイプを受け入れる)クラスを作成し、それをArray.Sort()メソッドに渡す必要があります。

于 2011-05-12T15:55:55.030 に答える
7

IComparable は、オブジェクトの既定の並べ替え順序を提供するために使用されます。

IComparer は、追加の比較メカニズムを提供します。

この記事を参照してください。 http://support.microsoft.com/kb/320727

于 2011-10-20T07:19:01.597 に答える
1

IComparer は、指定された 2 つのオブジェクトを比較します。IComparable は、それ自体の別のオブジェクトと比較する目的で、比較されるオブジェクトによって実装されます。

オブジェクトを並べ替えるために IComparable を実装することをお勧めします。IComparable は、さまざまな基準による並べ替え (たとえば、オブジェクト内の選択可能なフィールドによる並べ替え) に役立ちます。

参照: IComparable<T> をいつ使用するか IComparer<T>

于 2011-05-12T15:57:07.167 に答える
1

実装するクラスのインスタンスであるオブジェクトはIComparable、他のオブジェクトと比較できます。(「比較できる」と読みIComparableます。) これを行うこのインターフェイスのメソッドは ですCompareTo。これは、そのようなクラスのインスタンスに自分自身を他のオブジェクトと比較する方法を知らせたい場合に便利です。

実装するクラスのインスタンスであるオブジェクトをIComparer使用して、オブジェクトのペアを比較できます。(「比較できます」と読みIComparerます。) これを行うこのインターフェイスのメソッドは ですCompare。これは、比較されるオブジェクトのクラスから比較ロジックを切り離したい場合に便利です。オブジェクトを比較するさまざまな方法がある場合にこれを使用する可能性があるケースの 1 つ (大文字と小文字を区別しない文字列と大文字と小文字を区別する文字列の比較)。

于 2011-05-12T17:37:56.183 に答える