2011-05-26 50 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類型,因爲您可能會更清楚等於什麼。

這如何影響可比性是可比性在一定程度上依賴於平等。爲了知道小於或大於你的意思,你需要知道什麼等於意味着什麼。

相關問題