BCL有幾個地方可以使用IEqualityComparer。像Enumerable.Contains或Dictionary Constructor。如果我對default之一不滿意,我可以提供我的比較器。.NET中是否有任何一種「ReferenceComparer」?
有時候我想知道該集合是否包含那個對象,我有參考。不是那種在其他意義上被認爲「相等」的人。
現在的問題是:BCL中是否存在標準相等比較器,僅依賴於ReferenceEquals方法?
,我寫我自己的一個是這樣的:
class ReferenceComparer<T> : IEqualityComparer<T> where T : class
{
private static ReferenceComparer<T> m_instance;
public static ReferenceComparer<T> Instance
{
get
{
return m_instance ?? (m_instance = new ReferenceComparer<T>());
}
}
public bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
return RuntimeHelpers.GetHashCode(obj);
}
}
我也沒搞也沒有考慮很多的情況下測試,但它似乎使Enumerable.Contains
和Dictionary
很高興。
不幸的是,所有這些集合都是以Java風格的方式編寫的,需要編寫一個實現特定接口的類。如果只允許你傳入一個委託來指定比較運算符,那麼你可以直接傳遞`object.ReferenceEquals`。我想這是因爲需要兩種方法(比較和散列碼)。 – 2011-02-04 18:24:52
但據我瞭解,`IEqualityComparer`的Java對應語句沒有`GetHashCode`,因此如果Java支持委託,它可以作爲Java代理實現。 – Gabe 2011-02-04 18:35:31