這個問題幾乎說明了一切。.Net集合類在包含的成員上使用.Equals()來評估.Contains()?
集合類是否使用(覆蓋的).Equals()
方法來確定集合類.Contains()
是否爲元素?還是它使用引用相等或其他方法?
我希望收集類在確定集合.Contains()
是否爲元素時忽略包含成員上的單個字段。
這個問題幾乎說明了一切。.Net集合類在包含的成員上使用.Equals()來評估.Contains()?
集合類是否使用(覆蓋的).Equals()
方法來確定集合類.Contains()
是否爲元素?還是它使用引用相等或其他方法?
我希望收集類在確定集合.Contains()
是否爲元素時忽略包含成員上的單個字段。
這要求個人測試用例。 :)
編寫一個測試,用一個模擬對象構造一個列表,執行.Contains()。
現在檢查模擬對象 - 確實.Equals()被調用? 散列值呢?
或者,更好的是,閱讀文檔... – MartinStettner 2010-12-14 01:28:55
在這種情況下,文檔說的是什麼? – Arafangion 2010-12-14 01:41:44
CollectionBase的測試用例顯示Object.Equals IS在容器的.Contains()方法被調用時在包含分類中調用...但僅當集合包含> 1元素時(這是有意義的)。 – Flipster 2010-12-14 02:39:15
Collection
使用EqualityComparer<T>.Default
。 List
不是很清楚(它表示它使用「缺省的相等比較器,如對象的T的IEquatable<T>.Equals
方法的實現所定義的那樣」,它不解釋如果它不執行IEquatable
),但是我會懷疑它是一樣的。
這將使用IEquatable<T>
實現,如果類型實現它,或者只是常規的Object.Equals
和Object.GetHashCode
(它可以被重寫)。
有一個包含IEqualityComparer的重載,所以你可以推出自己的。
這取決於。並非所有的.NET集合甚至都實現了Contains。 請更具體。 – 2010-12-14 01:23:56
是的。我直接從CollectionBase繼承。 – Flipster 2010-12-14 02:13:15