Middle
Τι πρέπει να κάνετε για να χρησιμοποιήσετε μια κλάση ως κλειδί σε μια συλλογή;
sobes.tech AI
Απάντηση από AI
Για να χρησιμοποιήσετε μια κλάση ως κλειδί σε μια συλλογή (π.χ., στο Dictionary<TKey, TValue>), είναι απαραίτητο να υλοποιήσετε σωστά τις μεθόδους Equals και GetHashCode.
-
Υπερκαλύψτε το
Equals(object obj):- Συγκρίνετε το τρέχον αντικείμενο με ένα άλλο (
obj) για ισότητα. - Βεβαιωθείτε ότι το
objδεν είναιnull. - Βεβαιωθείτε ότι το
objέχει τον ίδιο τύπο με το τρέχον αντικείμενο. - Συγκρίνετε τα σημαντικά πεδία ή ιδιότητες και των δύο αντικειμένων.
- Συγκρίνετε το τρέχον αντικείμενο με ένα άλλο (
-
Υπερκαλύψτε το
GetHashCode():- Δημιουργήστε έναν κωδικό κατακερματισμού βασισμένο στα ίδια σημαντικά πεδία ή ιδιότητες που χρησιμοποιούνται στο
Equals. - Διασφαλίστε ότι αν το
Equalsεπιστρέφειtrueγια δύο αντικείμενα, οι μέθοδοιGetHashCodeτους επιστρέφουν την ίδια τιμή. - Συνιστάται η ομοιόμορφη κατανομή των κωδικών κατακερματισμού για τη μείωση των συγκρούσεων.
- Δημιουργήστε έναν κωδικό κατακερματισμού βασισμένο στα ίδια σημαντικά πεδία ή ιδιότητες που χρησιμοποιούνται στο
-
Προαιρετικά υλοποιήστε το
IEquatable<T>:- Παρέχει μια τυποποιημένη μέθοδο
Equals(T other), η οποία μπορεί να είναι πιο αποδοτική, αποφεύγοντας το boxing για τύπους τιμών.
- Παρέχει μια τυποποιημένη μέθοδο
Παράδειγμα:
using System;
using System.Collections.Generic;
public class MyKey
{
public int Id { get; }
public string Name { get; }
public MyKey(int id, string name)
{
Id = id;
Name = name;
}
// Υπερκαλύψτε το `Equals` για σύγκριση βάσει τιμών
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
MyKey other = (MyKey)obj;
return Id == other.Id && Name == other.Name;
}
// Υπερκαλύψτε το `GetHashCode` χρησιμοποιώντας τα ίδια πεδία
public override int GetHashCode()
{
// Χρησιμοποιήστε το Tuple για συνδυασμό των hash codes
return (Id, Name).GetHashCode();
}
// Προαιρετικά υλοποιήστε το `IEquatable<T>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Χωρίς σωστή υλοποίηση αυτών των μεθόδων, το Dictionary θα χρησιμοποιεί προεπιλεγμένη ισότητα ταυτότητας (συγκρίσεις αναφορών) και την προεπιλεγμένη υλοποίηση του GetHashCode (βασισμένη σε αναφορά), που μπορεί να οδηγήσει σε λανθασμένη λειτουργία της συλλογής κατά την αναζήτηση κλειδιών βάσει τιμής.