Imansible trovare la chiave nel dizionario generico

Non riesco a trovare una voce del dizionario per chiave. Ho un’interfaccia simile alla seguente:

public interface IFieldLookup { string FileName { get; set; } string FieldName { get; set; } } 

Allora ho un dizionario come questo:

 Dictionary fd 

Quando provo a recuperare un elemento dal dizionario tramite la chiave, ottengo un KeyNotFoundException. Suppongo di dover implementare qualche tipo di confronto – se la mia ipotesi è corretta, qual è il modo consigliato di implementare un confronto in questo caso?

Poiché si tratta di un’interfaccia anziché di una class, dovrai definire l’operatore di uguaglianza per ogni class che implementa l’interfaccia. E quegli operatori dovranno operare in modo coerente. (Questo sarebbe molto meglio se fosse una class piuttosto che un’interfaccia.)

È necessario eseguire l’override dei metodi Equals(object) e GetHashCode() su ogni class.

Probabilmente qualcosa del genere:

 public override bool Equals(object obj) { IFieldLookup other = obj as IFieldLookup; if (other == null) return false; return other.FileName.Equals(this.FileName) && other.FieldName.Equals(this.FieldName); } public override int GetHashCode() { return FileName.GetHashCode() + FieldName.GetHashCode(); } 

o questo:

 public override bool Equals(object obj) { IFieldLookup other = obj as IFieldLookup; if (other == null) return false; return other.FileName.Equals(this.FileName, StringComparison.InvariantCultureIgnoreCase) && other.FieldName.Equals(this.FieldName, StringComparison.InvariantCultureIgnoreCase); } public override int GetHashCode() { return StringComparer.InvariantCulture.GetHashCode(FileName) + StringComparer.InvariantCulture.GetHashCode(FieldName); } 

A seconda di come vuoi che si comporti.

utilizzare ContainsKey e sovrascrivere equals sulla class di chiavi

Ok diciamo che questa è la nostra class chiave:

 class Key { public int KeyValue; public override Equals(object o) { return ((Key)o).KeyValue == KeyValue); } } 

ora consente di utilizzare la class come chiave

 Dictonary dict = new Dictonary(); Key k = new Key(); k.KeyValue = 123; dict.Add(k, "Save me!"); Key k2 = new Key(); k2.KeyValue = 123; if (dict.ContainsKey(k2)) { string value = dict[k2]; } 

Implementare un’istanza di IEqualityComparer (consigliata derivando da EqualityComparer per l’implementazione automatica di IEqualityComparer ) per il tipo di chiave e passare un’istanza al costruttore del dizionario. In questo modo è ansible implementare il confronto in modo coerente tra più implementazioni dell’interfaccia.