2010-07-22 29 views
4

我對這是否是在C#中使用IComparer的標準有疑問。假設我有三個Person對象:P1,P2和P3。假設我稱之爲傳入P1和P2的比較方法,結果爲0.這基本上意味着兩個人應該被歸類爲平等。現在說我調用傳入P2和P3的比較方法,結果也是0。這又意味着兩個人是平等的。從邏輯上講,可以假設P1和P3也是相等的;然而,比較方法可以實現,但有人決定實施它。那麼在這種情況下,P1和P3也會返回0,這是否是一個標準?C#IComparer <T>標準使用問題

這裏是要問我什麼代碼:

// Assume these are initialized properly 
Person p1 = null, p2 = null, p3 = null; 
IComparer<Person> comparer = null; 

// Compare person 1 to person 2 and result is 0 
Debug.Assert(comparer.Compare(p1, p2) == 0); 

// Compare person 2 to person 3 and result is 0 
Debug.Assert(comparer.Compare(p2, p3) == 0); 

// Would this be a fair assumption that person 1 and person 3 would also be 0? 
Debug.Assert(comparer.Compare(p1, p3) == 0); 

回答

3

是的,那將是標準。它明確指出了IComparable接口:

如果A.CompareTo(B)返回零和 B.CompareTo(C)返回零,然後 A.CompareTo(C)被要求返回 爲零。

我無法找到的官方文檔中任何涉及的權利,並規定了ICompare同樣的事情,但我認爲它是安全的假設同樣適用。

2

平等是傳遞的,所以是你應該假設,並制定考慮到這一點你的IComparer。

Transitivity

4

它無關,與C#,這是一個簡單的數學規則:及物: http://en.wikipedia.org/wiki/Transitive_relation

所以,是在短。

---附加信息,由於評論---

如果你去閱讀有關的IComparer文檔: http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare.aspx

你會發現:

Compares two objects and returns a value indicating whether one is less than, 
equal to, or greater than the other. 

在其他這意味着當比較對象「a」和「b」時,在多次調用Compare方法時應始終得到相同的結果。如果不是這種情況,這意味着你會得到未定義的行爲,並且不可能依靠該函數進行任何分類或比較。

因此,當您正確實施此方法時,應用傳遞性規則,您可以毫無疑問地說,一個== C。

我希望澄清你對實施問題的質疑。

+0

我意識到,但比較方法可以以傳遞規則不適用的方式實現。 Compare方法可以返回新的Random()。Next();那麼傳遞規則就不適用了。所以我在問是否這是規則適用的比較方法的標準。 – Nick 2010-07-22 16:29:51

+1

這是一個慣例,而且足夠強大,足以成爲接口正常運行必須遵守的合同。未定義的行爲,如果你不遵守合同:) – user7116 2010-07-22 16:33:02

+0

真的很有趣。這就像製作一個方法:getCurrentTime(){return Time(Random()); }。這沒有意義。比較方法必須是有限的,並且始終具有相同的行爲。在你的例子中,如果連續調用3次,a.Compare(b)cound會返回3個不同的結果。我不認爲這是這個功能的用途。 – Sauleil 2010-07-22 16:35:01

3

它是界面合同的一部分,如果a == bb == ca == c(平等的過渡性質)。這不是在代碼中的任何地方強制執行的,但它需要正確運行。