可能重复:
What’s the difference between IComparable & IEquatable interfaces?
IComparable<T>和IEquatable<T>的主要区别是什么?什么时候具体使用每一个?
发布于 2009-11-14 16:33:46
IComparable定义顺序(小于,大于)。它定义的方法是CompareTo,您可以用它来确定两个元素之间的顺序。
IEquatable定义了等式。由它定义的方法等于,它允许您确定两个元素是否相等。
比较示例,按年龄排序人:
public class Person : IComparable<Person>
{
public int Age { get; set; }
public int ID { get; set; }
public int CompareTo(Person other)
{
return Math.Sign(Age - other.Age); // -1 other greater than this
// 0 if same age
// 1 if this greater than other
}
}排序用法:
[Test]
public void SortTest()
{
var persons = new List<Person>
{
new Person { Age = 0 },
new Person { Age = 2 },
new Person { Age = 1 }
};
persons.Sort();
Assert.AreEqual(0, persons[0].Age);
Assert.AreEqual(1, persons[1].Age);
Assert.AreEqual(2, persons[2].Age);
}相等示例,用于通过ID识别个人:
public class Person : IEquatable<Person>
{
public int Age { get; set; }
public int ID { get; set; }
public bool Equals(Person other)
{
return ID == other.ID;
}
}发布于 2009-11-14 16:33:10
如果在IEnumerable<T>,上排序,则使用IComparable<T>, (如果比较两个实例是否相等;IEquatable<T> )
发布于 2009-11-14 16:58:43
通常,任何排序都将使用类的IComparable接口(如果可用的话),否则.Net将应用默认排序,这可能是完全出乎意料的。
如果您不定义一个,那么将使用缺省值--在从IComparable继承的情况下,如果某个基类实现了这一点,那么排序顺序将是基类定义的任何顺序。
IEquatable定义相等,并允许您定义.Net如何确定类的实例是否与Equals方法相等。如果您没有定义一个,那么在默认情况下,等式是基于引用相等的。这意味着,除非您将两个引用与类的同一个实例进行比较,否则它们将不相等,即使您希望它们是相等的。同样,如果您继承了确实实现了接口的基类,并且没有在类中实现它,那么您将使用基类相等计算。
通常,如果要结合使用常见的.Net函数,那么实现这些功能是很重要的。例如,如果您在类的集合上使用class ()函数,那么它将尝试使用IEquatable接口
来自MSDN:
( <(T>)>)接口由泛型集合对象使用,例如Dictionary<( <(TKey,TValue>)>)、List<(<(T>)>和LinkedList<( <(T>)>),它们在测试包含、IndexOf、LastIndexOf和Remove等方法中是否相等时使用。它应该为可能存储在泛型集合中的任何对象实现。
IComparable<(Of <(T>)>)接口提供了一种强类型比较方法,用于排序泛型集合对象的成员。因此,通常不会直接从开发人员代码中调用它。相反,它是由List<(Of <(T>)>)..::.Sort()和Add等方法自动调用的。
。
https://stackoverflow.com/questions/1734737
复制相似问题