Ci sono diversi posti in BCL dove si può fare uso di IEqualityComparer. Come Enumerable.Contains o Dictionary Constructor. Posso fornire il mio comparatore se non sono soddisfatto dello default.Esiste qualche tipo di "ReferenceComparer" in .NET?
A volte voglio sapere se la raccolta contiene quello stesso oggetto a cui mi riferisco. Non quello che è considerato "uguale" in nessun altro significato.
La domanda è: se esiste un confronto di uguaglianza standard nel BCL che si basa solo sul metodo ReferenceEquals?
Quello che io ho scritto è questo:
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);
}
}
non ho la prova a fondo, né sacco considerati di scenari, ma sembra di fare Enumerable.Contains
e Dictionary
abbastanza felice.
È un peccato che tutte queste raccolte siano state scritte in modo Java, richiedendo di scrivere una classe che implementa un'interfaccia specifica. Se solo ti permettessero di passare in un delegato per specificare l'operatore di confronto, potresti passare direttamente "oggetto.ReferenceEquals". Immagino sia perché sono necessari due metodi (confronto e codice hash). –
A quanto ho capito, però, la controparte Java di 'IEqualityComparer' non ha un' GetHashCode', quindi * potrebbe * essere implementato come delegato in Java se i delegati supportati da Java. – Gabe
@Ben guarda la risposta di orip: http: // stackoverflow.it/questions/98033/wrap-a-delegate-in-an-iequalitycomparer/1239337 # 1239337 –