2010-12-14 42 views
2

這個問題幾乎說明了一切。.Net集合類在包含的成員上使用.Equals()來評估.Contains()?

集合類是否使用(覆蓋的).Equals()方法來確定集合類.Contains()是否爲元素?還是它使用引用相等或其他方法?

我希望收集類在確定集合.Contains()是否爲元素時忽略包含成員上的單個字段。

+0

這取決於。並非所有的.NET集合甚至都實現了Contains。 請更具體。 – 2010-12-14 01:23:56

+0

是的。我直接從CollectionBase繼承。 – Flipster 2010-12-14 02:13:15

回答

2

根據thesearticles,除非您的對象實現IEquatable,否則使用Object.Equals。

+0

尼斯,雅各。雖然你的答案很短,但它是第一個只有足夠信息的人。感謝您的鏈接。我在廣泛的搜索中發現了。 +1並被接受。哦,是的...而且它也起作用了。 – Flipster 2010-12-14 02:45:08

2

這要求個人測試用例。 :)

編寫一個測試,用一個模擬對象構造一個列表,執行.Contains()。

現在檢查模擬對象 - 確實.Equals()被調用? 散列值呢?

+2

或者,更好的是,閱讀文檔... – MartinStettner 2010-12-14 01:28:55

+0

在這種情況下,文檔說的是什麼? – Arafangion 2010-12-14 01:41:44

+1

CollectionBase的測試用例顯示Object.Equals IS在容器的.Contains()方法被調用時在包含分類中調用...但僅當集合包含> 1元素時(這是有意義的)。 – Flipster 2010-12-14 02:39:15

3

Collection使用EqualityComparer<T>.DefaultList不是很清楚(它表示它使用「缺省的相等比較器,如對象的T的IEquatable<T>.Equals方法的實現所定義的那樣」,它不解釋如果它不執行IEquatable),但是我會懷疑它是一樣的。

這將使用IEquatable<T>實現,如果類型實現它,或者只是常規的Object.EqualsObject.GetHashCode(它可以被重寫)。

1

有一個包含IEqualityComparer的重載,所以你可以推出自己的。