2011-05-26 59 views
11

我已经写了一大堆对象,这些对象都是集合的所有部分,我需要对其进行大量的排序和搜索。在大多数这些对象上,我已经实施并覆盖了Equals方法,IEquatableoperator!operator==列表<T>排序使用比较器<T>而不是IEquatable,为什么?

现在我想要在上面实现的对象上使用List<T>.Sort,事实证明我需要实现IComparable来执行自定义排序。

为什么Sort使用IComparable,那么在我的所有对象中有什么是IEquatable

另外,Object.Equal压倒一切与这一切有什么关系?

+1

思想实验;你有三个整数,'a','b'和'c';你知道'a == b','a!= c'和'b!= c'(这是所有可用的组合)。现在:把'a','b'和'c'按升序排列; p – 2011-05-26 12:47:33

回答

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(); 
4

因为IComparable允许确定一个对象是否比另一个对象“更小”或“更大”,而IEquatable有助于确定两个对象是否“相等”。

前者需要进行排序,因为只要知道哪些对象具有相同的值并不能帮助您将它们按特定顺序排列。

7

平等只能给你两个对象是否相等的结果。它不能告诉你x应该在排序的顺序之前或之后y。只考虑平等,你会如何建议List<T>应该执行任何排序?

实施IEquatable<T>的要点是当它是等于这是重要的,例如,在HashSet<T>或作为Dictionary<TKey, TValue>的关键类型。同样,那些不能有效使用只有IComparable<T>,因为它不会提供散列码。

这两个接口基本上用于不同的情况。

4

因为排序并不依赖于平等而是相对排名。为了排序,你需要知道对象相对于彼此的位置。大于,小于,等于。

0

平等告诉你两个实例是否相等。可比性告诉你如何对它们进行排序。

如果您比运行时知道您的类型的平等程度如何,则覆盖实例版本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"); 
} 

值类型的默认相等意味着所有成员变量都相等。您通常应该重写Equals for value类型,因为您可能会更清楚等于什么。

这如何影响可比性是可比性在一定程度上依赖于平等。为了知道小于或大于你的意思,你需要知道什么等于意味着什么。