2010-03-09 170 views

回答

160

IEquatable測試兩個對象是否相等。

IComparable對所比較的對象施加總排序。

例如,IEquatable會告訴你,5不等於7 IComparable會告訴你,5 7.

7

前之際,在MSDN Page for IEquatable說:

IComparable接口定義 CompareTo方法,該方法確定 實施類型的實例的排序順序 。 IEquatable 接口定義了Equals方法, ,其確定實現類型的實例的等同性。

EqualsCompareTo

10

除了格雷格D的答案:

你可能會實現IComparable沒有實現IEquatable的一類,其中一個部分排序是有意義的,並且在非常明確地希望消費者因爲CompareTo()返回零,所以這個不是意味着對象是相等的(除了排序的目的)。

+9

這聽起來更像是一個特例比較器,而不像一個正確實現'IComparable'的對象。你能想出一個有意義的例子,其中'CompareTo(...)== 0'不**意味着平等嗎?我當然不能。事實上,接口契約(按照MSDN)**要求**「CompareTo(...)== 0」意味着相等。說白了,在這種情況下,使用一個特殊的Comparator對象,不*執行'IComparable'。 – 2010-03-09 17:05:00

+2

@Konrad - 我確實指出了一些注意事項 - 類型沒有實現IEquatable(很明顯,發起者不想包含一個相等性測試),並且CompareTo結果用於排序,* not *用於評估相等性。您還會遇到相關性相等的問題(參考,值,忽略「任意」屬性 - 爲了IComparable的目的,長度爲500頁的藍皮書可能與長度爲500頁的紅皮書相等) – 2010-03-09 18:35:58

+3

你最後一句話是錯誤的,這是我想指出的特別的錯誤:'IComparable'在這裏完全不合適。你得到的是一個非常特殊的訂單,只適用於一種特殊的情況。對於這種情況,實施一般性的「IComparable」是錯誤的。這就是'IComparer'的用處。例如,人們不能被有意義地排序。但他們*可以根據他們的薪水,他們的鞋子大小,雀斑數量或體重來訂購。因此,我們將爲所有這些情況實施不同的IComparer。 – 2010-03-09 19:08:27

13

IEquatable<T>爲了平等。

IComparable<T>訂購。