web-dev-qa-db-ja.com

IComparableインターフェイスとIEquatableインターフェイスの違いは何ですか?

両方のインターフェースがオブジェクトの同等性を比較しているように見えるので、それらの主な違いは何ですか?

90
SoftwareGeek

IEquatableは、2つのオブジェクトが等しいかどうかをテストします。

IComparableは、比較されるオブジェクトに合計順序付けを課します。

たとえば、IEquatableは、5が7と等しくないことを示します。IComparableは、5が7の前に来ることを示します。

182
Greg D

IEquatable<T>平等。

IComparable<T>注文用。

15
Islam Yahiatene

グレッグDの答えに加えて:

IComparableを実装せずにIEquatableを実装するかもしれません。部分的な順序付けが理にかなっているクラスで、CompareTo()がゼロを返すという理由だけで消費者にそれを推測させたい場合、 this does notは、オブジェクトが等しいことを意味します(ソート目的以外の場合)。

10

IEquatableのMSDNページ に記載されているとおり:

IComparableインターフェイスは、CompareToメソッドを定義します。このメソッドは、実装タイプのインスタンスのソート順を決定します。 IEquatableインターフェイスはEqualsメソッドを定義します。このメソッドは、実装タイプのインスタンスの等価性を決定します。

Equals vs. CompareTo

6
Will Eddins

_IComparable <T>_は、オブジェクトの順序付けまたはソートに使用できるタイプ固有の比較メソッドを定義します。

_IEquatable <T>_は、同等性を判定するための実装に使用できる一般化されたメソッドを定義します。


Personクラスがあるとしましょう

_public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };

List<Person> people = new List<Person> { p1, p2, p3, p4 };
_

これらのオブジェクトをソートするには、people.Sort();を使用できます。

しかし、これは例外をスローします。

enter image description here

フレームワークは、これらのオブジェクトをソートする方法を知りません。 IComparableインターフェースの実装をソートする方法を伝える必要があります。

_public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(object obj)
    {
        Person otherPerson = obj as Person;
        if (otherPerson == null)
        {
            throw new ArgumentNullException();
        }
        else
        {
            return Age.CompareTo(otherPerson.Age);
        }
    }
}
_

これにより、Sort()メソッドで配列が適切にソートされます。


次に、2つのオブジェクトを比較するには、Equals()メソッドを使用できます。

_var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
_

これはfalseメソッドが2つのオブジェクトを比較する方法を知らないため、Equalsを返します。したがって、IEquatableインターフェースを実装し、フレームワークに比較方法を伝える必要があります。前の例を拡張すると、次のようになります。

_public class Person : IComparable, IEquatable<Person>
{
    //Some code hidden

    public bool Equals(Person other)
    {
        if (Age == other.Age && Name == other.Name)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
_
3
Nipuna