Quote:
Originariamente inviato da gugoXX
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.