Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Override GetHashCode σε κλάση με Dictionary

Îåêßíçóå áðü ôï ìÝëïò Markos. Τελευταία δημοσίευση από το μέλος Markos στις 02-05-2012, 11:33. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-05-2012, 10:50 70189

    Override GetHashCode σε κλάση με Dictionary

    Έχω μία κλάση στην οποία θέλω να κάνω implement το IEquatable<T>. Τα properties που με ενδιαφέρουν είναι custom objects, καθώς και ένα dictionary, κάπως έτσι:

    Class MyObject : IEquatable<MyObject>{

    private MyType1 myType1;
    private MyType2 myType2;
    ..
    private Dictionary<MyTypeX, MyTypeY> myDictionary=new Dictionary<MyTypeX, MyTypeY>();
    }

    Σε όλα τα types έχω κάνει implement το IEquatable<T> και θέλω να κάνω το ίδιο και για το "MyObject". Θέλω το "Equals(MyObject other)" να επιστρέφει true όχι μόνο αν κάποια properties που με ενδιαφέρουν είναι ίδια, αλλά επιπλέον και όταν τα δύο Dictionaries περιέχουν τα ίδια KeyValuePairs. Μέχρις εδώ καλά. Στη συνέχεια κάνω override την "Equals(object obj)" και στο τέλος πρέπει να κάνω override την GetHashCode. Πως με συμβουλεύετε να το κάνω για να γίνει σωστά το implementation της GetHashCode;


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  02-05-2012, 11:27 70190 σε απάντηση της 70189

    Απ: Override GetHashCode σε κλάση με Dictionary

    Η GetHashCode δεν χρειάζεται να επιστρέφει κάποιο πραγματικά μοναδικό αριθμό. Κατά κανόνα χρησιμοποιείται για ένα γρήγορο έλεγχο πριν κληθεί η ίδια η Equals. Αρκεί λοιπόν να βεβαιωθείς ότι το ίδιο αντικείμενο θα επιστρέφει πάντα το ίδιο hashcode και ότι θα υπάρχει αρκετή διαφοροποίηση από το ένα αντικείμενο στο επόμενο. Από την άλλη, ο υπολογισμός του HashCode θα πρέπει να είναι γρήγορος, αλλιώς χάνεται το νόημα του "γρήγορου ελέγχου".

    Η μεγάλη διαφοροποίηση χρειάζεται σε containers όπως το Dictionary ή το HashSet οι οποίοι χρησιμοποιούν το HashCode εσωτερικά για γρήγορα Lookups.

    Κατά κανόνα ένα απλό XOR μεταξύ των hashcode των πεδίων του αντικειμένου αρκεί για να υπολογίσεις το hashcode του ίδιου του αντικειμένου. Θα πρέπει να προσέξεις όμως ότι το Dictionary δεν έχει δικό του GetHashCode  και χρησιμοποιεί την Object.GetHashCode. Αν θέλεις να ληφθούν υπόψη τα hashcode των περιεχομένων του Dictionary θα πρέπει με κώδικα να υπολογίσεις το XOR των τιμών. Για παράδειγμα:

    var hashCode = field1.GetHashCode();
    hashCode ^= field2.GetHashCode();
    foreach (var pair in dict)
    {
        hashCode ^= pair.Key.GetHashCode();
        hashCode ^= pair.Value.GetHashCode();
    }


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-05-2012, 11:33 70191 σε απάντηση της 70190

    Απ: Override GetHashCode σε κλάση με Dictionary

    ΟΚ. Ευχαριστώ!

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems