Hay varios lugares en BCL donde se puede hacer uso de IEqualityComparer. Como Enumerable.Contains o Dictionary Constructor. Puedo proporcionar mi comparador si no estoy satisfecho con el default.¿Hay algún tipo de "ReferenceComparer" en .NET?
A veces quiero saber si la colección contiene ese mismo objeto al que me he referido. No es el que se considera "igual" en ningún otro significado.
La pregunta es: si existe un comparador de igualdad estándar en el BCL que se basa únicamente en el método ReferenceEquals?
El que escribí a mí mismo es la siguiente:
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);
}
}
no he probado a fondo ni se considerará una gran cantidad de escenarios, pero parece que tiene Enumerable.Contains
y Dictionary
muy feliz.
Desafortunadamente, todas estas colecciones están escritas de forma similar a Java, lo que requiere que escriba una clase que implemente una interfaz específica. Si solo le permitieran pasar un delegado para especificar el operador de comparación, podría pasar 'object.ReferenceEquals' directamente. Supongo que es porque se necesitan dos métodos (comparación y hashcode). –
Según tengo entendido, la contraparte de Java para 'IEqualityComparer' no tiene' GetHashCode', por lo que * podría * implementarse como delegado en Java si los delegados admitidos por Java. – Gabe
@Ben mira la respuesta de orip: http: // stackoverflow.com/questions/98033/wrap-a-delegate-in-an-iequalitycomparer/1239337 # 1239337 –