View Single Post
Old 22-10-2013, 08:41   #4
LS1987
Senior Member
 
Iscritto dal: Apr 2010
Messaggi: 1707
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Implementa l'interfaccia IEquatable<KeyValueTriple>
(Per questioni di chiarezza e pulizia)

E scrivi un GetHashCode che abbia un senso, non il semplice

public override int GetHashCode()
{
return base.GetHashCode();
}

Il tuo hashcode deve dipendere dagli hascode degli elementi che compongono la chiave, in questa classe tutti e 3 gli elementi.
Il criterio e' che oggetti uguali devono avere lo stesso hashcode.

Richiamare l'hashcode base e' il problema principale.
2 oggetti (object), anche se hanno contenuti uguali avranno hashcode diverso, perche' la object.GetHashCode restituisce l'indirizzo di memoria, che e' appunto diverso in 2 istanze diverse, quand'anche uguali in contenuto.
Per quello che non trovi gli elementi nella Dictionary, anche se apparentemente presenti.

Quindi prima approssimazione metti
Key1.GetHashCode() + Key2.GetHashCode() + Key3.GetHashCode()
Meglio sarebbe cucinare per qualche fattore primo moltiplicativo per evitare quanto piu' possibile overlapping di valori tra oggetti diversi che avranno invece stessa HashCode (Che non e' vietato, solo meno efficiente)
Ti ringrazio, ho aggiunto il metodo Equals che estende quello di IEquatable<KeyValueTriple<TKey1, TKey2, TValue>> e ho aggiustato GetHashCode

Codice:
public override bool Equals(KeyValueTriple<TKey1, TKey2, TValue> obj)
      {
         if (obj == null) return false;
         if ((this.key1.Equals(obj.key1)) && (this.key2.Equals(obj.key2)) && (this.value.Equals(obj.value)))
            return true;
         return false;
      }

      public override int GetHashCode()
      {
         if ((key1 == null) || (key2 == null) || (value == null))
            throw new NullReferenceException("Arguments null");
         return key1.GetHashCode() + key2.GetHashCode() + value.GetHashCode();
      }
Adesso non ho fissato dei valori moltiplicatori, ma non mi interessa anche se è meno efficiente, per ora vorrei risolvere i problemi.

Mi viene restituito l'errore "Error 1 'ConsoleApplication3.KeyValueTriple<TKey1,TKey2,TValue>.Equals(ConsoleApplication3.KeyValueTriple<TKey1,TKey2,TValue>)': no suitable method found to override"

Eppure dovrebbe effettuare l'override del metodo Equals di IEquatable<KeyValueTriple<TKey1, TKey2, TValue>> L'override del metodo Equals di Object viene effettuata senza problemi, ho anche provato a toglierla, per vedere se ci sono dei conflitti, ma non riesco a risolvere.

Per il resto il programma funziona, anche senza effettuare l'override del metodo Equals.

Ultima modifica di LS1987 : 22-10-2013 alle 08:48. Motivo: Funziona lo stesso, l'errore che ho postato è ignorabile.
LS1987 è offline   Rispondi citando il messaggio o parte di esso