104

两个接口似乎都比较对象是否相等,那么它们之间的主要区别是什么?

4

5 回答 5

203

IEquatable测试两个对象是否相等。

IComparable对被比较的对象施加总排序。

例如,IEquatable会告诉你 5 不等于 7。 IComparable会告诉你 5 在 7 之前。

于 2010-03-09T15:22:00.350 回答
23

IEquatable<T>为了平等。

IComparable<T>订购。

于 2010-03-09T16:15:46.170 回答
12

除了 Greg D 的回答:

您可以IComparable在不实现IEquatable部分排序有意义的类的情况下实现,并且您非常肯定希望消费者仅仅因为CompareTo()返回零就推断出这一点,这并不意味着对象是相等的(除了排序目的之外)。

于 2010-03-09T15:30:29.993 回答
8

IEquatable 的 MSDN 页面所述

IComparable 接口定义CompareTo方法,该方法确定实现类型实例的排序顺序。IEquatable 接口定义Equals方法,该方法确定实现类型实例的相等性。

Equals对比CompareTo

于 2010-03-09T15:22:57.817 回答
6

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,因为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;
        }
    }
}
于 2019-04-28T13:07:57.213 回答