我写了很多对象,这些对象都是集合的一部分,我需要做很多排序和搜索。在大多数这些对象中,我实现并覆盖了Equals
方法,IEquatable
和operator!
以及operator==
。
现在我想要对已实现上述所有内容的对象使用List<T>.Sort
,结果我需要实现IComparable
来进行自定义排序。
为什么排序使用IComparable
,那么在我的所有对象中有IEquatable
是什么意思?
Object.Equal
覆盖与所有这些有什么关系?
答案 0 :(得分:14)
它不可能使用IEquatable<T>
进行排序 - 知道两件事是否相等并不能帮助你排名。但是,如果您的类型实现它,则可以使用IComparable<T>
,或者使用任何IComparer<T>
(包括Comparer<T>.Default
)来提供自定义比较器对象。功能样式(Comparison<T>
)也很方便,无需大量代码进行临时排序:
list.Sort((x,y) => string.Compare(x.Name, y.Name));
但如果您只想要一个简单的序数排序,请让T
实施IComparable<T>
,然后使用:
list.Sort();
答案 1 :(得分:7)
平等只能给你两个对象是否相等的结果。它无法告诉您x
是否应在排序顺序中y
之前或之后出现。只有平等,你会如何建议List<T>
应该进行任何排序?
实施IEquatable<T>
的目的在于什么时候平等,这很重要,例如在HashSet<T>
中或作为Dictionary<TKey, TValue>
中的键类型。同样,使用仅 IComparable<T>
无法有效实现这些,因为它不会提供哈希码。
这两个界面基本上用于不同的情况。
答案 2 :(得分:4)
因为IComparable
允许确定对象是否比另一个对象“更小”或“更大”,而IEquatable
有助于确定两个对象是否“相等”。
前者是排序所必需的,因为只知道哪些对象具有相同的价值并不能帮助你按照特定的顺序排列它们。
答案 3 :(得分:4)
因为排序不仅取决于平等而且取决于相对等级。为了排序,您需要知道对象相对于彼此的位置。大于,小于,等于。
答案 4 :(得分:0)
嗯,正如您在the other questions about this topic中看到的那样,IEquatable<T>
检查是否相等,而IComparable<T>
引入了排序所需的排名。
答案 5 :(得分:0)
使用IEquatable
界面定义equivalence relation,但要进行排序,您需要ordering。
答案 6 :(得分:0)
Equality告诉您两个实例是否相等。可比性告诉您如何对它们进行排序。
如果您比运行时更了解您的类型的相等性如何,则覆盖Object.Equals
的实例版本。
引用类型的相等性默认为引用相等(相同的引用是同一个对象)。
object o1 = new object();
object o2 = o1;
if(o2==o1)
{
Console.WriteLine("These reference types are equal");
}
object o3 = new object();
if(o2 != o3)
{
Console.WriteLine("These reference types are not equal");
}
值类型的默认相等意味着所有成员变量都相等。您通常应该为值类型重写等于,因为您可能更清楚知道等于什么意思。
这对可比性的影响是可比性在某种程度上依赖于平等。为了知道小于或大于你需要知道什么等于意味着什么意味着什么。