В BCL есть несколько мест, где можно использовать IEqualityComparer. Как Enumerable.Contains или конструктор словаря. Я могу предоставить свой компас, если меня не устраивает по умолчанию.
Иногда я хочу знать, содержит ли коллекция тот самый объект, на который я ссылаюсь. Не тот, который считается "равным" в любом другом значении.
Возникает вопрос: существует ли в 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);
}
}
Я не тестировал его полностью и не рассматривал множество сценариев, но, похоже, он очень рад. и Dictionary
.