在BCL中,有几个地方可以使用IEqualityComparer,例如Enumerable.Contains或Dictionary Constructor。如果我不满意default的比较器,我可以提供自己的。
有时候我想知道集合中是否包含我所引用的那个对象,而不是其他任何意义上“相等”的对象。
问题是: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
非常满意。
object.ReferenceEquals
。我想这是因为需要两个方法(比较和哈希码)。 - Ben Voigt