可能重复:
What’s the difference between IComparable & IEquatable interfaces?
IComparable<T>
和IEquatable<T>
之间的主要区别是什么?
何时具体使用每一个?
答案 0 :(得分:9)
IComparable 定义顺序(小于,大于)。它定义的方法是 CompareTo ,您可以使用它来确定两个元素之间的顺序。
IEquatable 定义了相等性。它定义的方法是 Equals ,它可以让你确定两个元素是否相等。
比较示例,按年龄排序人:
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;
}
}
答案 1 :(得分:2)
如果你正在使用IEnumerable<T>,
使用IComparable<T>,
进行排序,如果比较两个实例是否相等; IEquatable<T>
答案 2 :(得分:1)
一般来说,任何排序都会使用你的类的 IComparable 接口,否则.Net将应用默认排序,这可能是完全出乎意料的。
如果你没有定义一个,那么将使用默认值 - 如果你继承了 IComparable 的东西,那么如果某个基类实现了这个,那么排序顺序将是基类定义的。
IEquatable 定义了相等性,并允许您定义.Net如何确定类的实例是否与Equals方法相等。如果没有定义一个,则默认情况下,相等性基于引用相等性。这意味着,除非您将两个引用与同一个类的实例进行比较,否则它们将不相等,即使您希望它们相等。再次,如果您从实现接口的基类继承而您没有在类中自己实现它,那么您将使用基类相等计算。
一般来说,如果要将常见的.Net功能与它们结合使用,那么实现这些功能非常重要。例如,如果您对类的集合使用Contains()函数,那么它将尝试使用IEquatable接口
来自MSDN:
IEquatable&lt;(&lt;(T&gt;)&gt;)接口 由通用集合对象使用 例如Dictionary&lt;(Of&lt;(TKey, TValue&gt;)&gt;),List&lt;(Of&lt;(T&gt;)&gt;),和 LinkedList&lt;(Of&lt;(T&gt;)&gt;)测试时 在这些方法中的平等 包含,IndexOf,LastIndexOf和 去掉。它应该实现 任何可能存储在。中的对象 通用集合。
IComparable&lt;(Of&lt;(T&gt;)&gt;)接口 提供强类型比较 订购成员的方法 通用集合对象。因为 这通常不会被调用 直接来自开发者代码。代替, 它由方法自动调用 例如List&lt;(Of &lt;(T&gt;)&gt;).. ::。Sort()()()和Add