2011-10-13 10 views
6

il metodo "Equal" e "GetHashcode" esistono nella classe dell'oggetto e il nostro tipo eredita la classe base dell'oggetto. qual è la differenza tra implementare direttamente i due metodi dell'oggetto e utilizzare l'interfaccia IComparer?Perché abbiamo bisogno dell'interfaccia IEqualityComparer, IEqualityComparer <T>?

se si esegue l'override dell'oggetto Equal e GetHashCode e si preme su un hashtable, verrà utilizzato il metodo di sovrascrittura uguale?

quali sono i diversi di una nuova tabella hash con il costruttore IEqualityComparer?

risposta

14

L'interfaccia IComparable viene utilizzata quando è necessario essere in grado di "ordinare" oggetti e fornisce un metodo (CompareTo) che indica se due oggetti sono <, = o>. Il costruttore che utilizza IEqualityComparer ti consente di assegnare uno specifico Equals/GetHashCode che può essere diverso da quelli definiti dal tuo oggetto. Normalmente il Hashtable utilizzerà l'oggetto sottoposto a override Equals e GetHashCode (oppure la base objectEquals e GetHashCode).

per fare un esempio, la stringa standard a confronto in maniera sensibile caso ("A"! = "a"), ma si potrebbe fare una classe IEqualityComparer di supporto per essere in grado di hash le corde in modo insensibile caso. (Tecnicamente questa classe è già presente in molteplici varianti: essi sono chiamati StringComparer.InvariantCultureIgnoreCase e tutti gli altri metodi statici StringComparer che restituiscono un oggetto StringComparer che implementa il IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string>)

Come nota, i Hashtable usi un parametro opzionale IEqualityComparer, non la versione generica IEqualityComparer<T>, perché Hashtable è pre-generico.

1

le interfacce IComparer (sia quella generica che quella non generica) consentono di confrontare due istanze l'una con l'altra.

Il metodo Compare consente di confrontare un oggetto stesso con un'altra istanza. Offcourse, quando l'istanza corrente è nullo, in questo caso riceverai un NullReferenceException, dal momento che chiami Compare in un'istanza "nulla". Una classe che implementa IComparer può risolvere questo problema.

Così, quando si implementa l'interfaccia IComparer, avrete una classe che ha un metodo 'Confronta', che può essere chiamato in questo modo:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

questo ti permette di fare questo:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

Quando si crea un'istanza di un Hashtable con il costruttore in cui si specifica l'istanza IEqualityComparer, questo significa che la data IEqualityComparer saranno utilizzati per determinare se una certa chiave è già presente nel Hashtable.
In caso contrario, verrà utilizzato il metodo Confronto dell'oggetto chiave.

Problemi correlati