両方のインターフェースがオブジェクトの同等性を比較しているように見えるので、それらの主な違いは何ですか?
IEquatable
は、2つのオブジェクトが等しいかどうかをテストします。
IComparable
は、比較されるオブジェクトに合計順序付けを課します。
たとえば、IEquatable
は、5が7と等しくないことを示します。IComparable
は、5が7の前に来ることを示します。
IEquatable<T>
平等。
IComparable<T>
注文用。
グレッグDの答えに加えて:
IComparable
を実装せずにIEquatable
を実装するかもしれません。部分的な順序付けが理にかなっているクラスで、CompareTo()
がゼロを返すという理由だけで消費者にそれを推測させたい場合、 this does notは、オブジェクトが等しいことを意味します(ソート目的以外の場合)。
IEquatableのMSDNページ に記載されているとおり:
IComparableインターフェイスは、
CompareTo
メソッドを定義します。このメソッドは、実装タイプのインスタンスのソート順を決定します。 IEquatableインターフェイスはEquals
メソッドを定義します。このメソッドは、実装タイプのインスタンスの等価性を決定します。
Equals
vs. CompareTo
_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();
を使用できます。しかし、これは例外をスローします。
フレームワークは、これらのオブジェクトをソートする方法を知りません。 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()
メソッドで配列が適切にソートされます。
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;
}
}
}
_