Sof*_*eek 90 c# interface icomparable iequatable
这两个接口似乎都在比较对象是否相等,那么它们之间的主要区别是什么?
Gre*_*g D 180
IEquatable
测试两个对象是否相等.
IComparable
对被比较的对象施加总排序.
例如,IEquatable
会告诉你5不等于7. IComparable
会告诉你5在7之前.
Dam*_*ver 10
除了Greg D的回答:
您可以实现IComparable而不为部分排序有意义的类实现IEquatable,并且非常肯定您希望消费者绘制推理,因为CompareTo()返回零,这并不意味着对象是相等的(对于任何事情)除了分类目的).
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 };
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将使用Sort()
方法对数组进行正确排序。
Equals()
方法。var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
Run Code Online (Sandbox Code Playgroud)
这将返回,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;
}
}
}
Run Code Online (Sandbox Code Playgroud)