どちらのインターフェースもオブジェクトが等しいかどうかを比較しているようですが、それらの主な違いは何ですか?
どちらのインターフェースもオブジェクトが等しいかどうかを比較しているようですが、それらの主な違いは何ですか?
回答:
IEquatable<T>
平等のために。
IComparable<T>
注文用。
グレッグDの答えに加えて:
部分的な順序付けが意味をなすクラスを実装IComparable
せずに実装IEquatable
し、CompareTo()
ゼロを返すからといって消費者にそれを確実に推測させたい場合、これはオブジェクトが等しいことを意味するわけではありません(並べ替え以外の目的で)。
IComparable
ここでは完全に不適切です。入手できるのは、1つの特別な状況でのみ適用される非常に特殊な順序です。このような状況では、将軍の実装IComparable
は間違っています。これIComparer
が目的です。たとえば、人々は意味のある注文をすることができません。ただし、給与、靴のサイズ、そばかすの数、または体重に応じて注文できます。したがって、IComparer
これらすべてのケースに異なるを実装します。
IEquatableのMSDNページで述べたように:
IComparableインターフェイスは
CompareTo
、実装するタイプのインスタンスのソート順を決定するメソッドを定義します。IEquatableインターフェイスはEquals
、実装するタイプのインスタンスの同等性を決定するメソッドを定義します。
Equals
対 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()
メソッドを使用して2つのオブジェクトを比較します。var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
これはfalse
、Equals
メソッドが2つのオブジェクトを比較する方法を知らないために返されます。したがって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;
}
}
}
IEquatable
ジェネリック<Person>
を使用し、使用IComparable
しないのですか?
IComparable
適切に実装されているのではなく、特別な場合の比較のように聞こえます。が平等を意味CompareTo(…) == 0
しない意味のある例を思いつきますか?私は確かにできません。実際、インターフェイスコントラクト(MSDNによる)では、CompareTo(…) == 0
同等であることを意味します。率直に言って、あなたのような場合は、特別なComparator
オブジェクトを使用し、実装しないでくださいIComparable
。