В 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);
}
}
Я не тестировал его тщательно и не рассматривал множество сценариев, но, похоже, Enumerable.Contains
и Dictionary
очень счастливы.
object.ReferenceEquals
напрямую. Думаю, это потому, что нужны два метода (сравнение и хэш-код). - person Ben Voigt   schedule 04.02.2011IEqualityComparer
не имеетGetHashCode
, поэтому он может быть реализован как делегат в Java, если Java поддерживает делегаты. - person Gabe   schedule 04.02.2011DelegateQualityComparer<T>
, который принимает два делегата (один для равенства, один для хэш-кода). И тот, который использует только один делегат, сопоставляющий сравниваемый тип с результатом делегата и сравнивающий этот тип, тоже может быть полезен, поскольку сравнение свойства - распространенный сценарий. - person CodesInChaos   schedule 04.02.2011DelegateEqualityComparer
) в значительной степени суть ссылки, которую дал Hellfrost. - person Ben Voigt   schedule 04.02.2011