Answers:
IEquatable<T>
为了平等。
IComparable<T>
订购。
除了格雷格D的答案:
您可能IComparable
没有实现IEquatable
对部分排序有意义的类,而您确实希望消费者推断出仅仅因为CompareTo()
返回零,这并不意味着对象相等(除了排序目的以外),这可能不会实现。
IComparable
在这里完全不合适。您所拥有的是非常特殊的顺序,仅适用于一种特殊情况。在这种情况下,实施将军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()
method 对数组进行正确排序。
Equals()
method。var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
这将返回,false
因为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;
}
}
}
IEquatable
使用一个通用的<Person>
和IComparable
不?
IComparable
正确的对象。你能想出一个有意义的例子,其中CompareTo(…) == 0
并没有暗示平等?我当然不能。实际上,接口协定(按照MSDN)要求这CompareTo(…) == 0
意味着平等。说穿了,在这样的情况下你的,使用一种特殊的Comparator
对象,也没有实现IComparable
。