Sobes.tech
Middle

Τι πρέπει να κάνετε για να χρησιμοποιήσετε μια κλάση ως κλειδί σε μια συλλογή;

sobes.tech AI

Απάντηση από AI

Για να χρησιμοποιήσετε μια κλάση ως κλειδί σε μια συλλογή (π.χ., στο Dictionary<TKey, TValue>), είναι απαραίτητο να υλοποιήσετε σωστά τις μεθόδους Equals και GetHashCode.

  1. Υπερκαλύψτε το Equals(object obj):

    • Συγκρίνετε το τρέχον αντικείμενο με ένα άλλο (obj) για ισότητα.
    • Βεβαιωθείτε ότι το obj δεν είναι null.
    • Βεβαιωθείτε ότι το obj έχει τον ίδιο τύπο με το τρέχον αντικείμενο.
    • Συγκρίνετε τα σημαντικά πεδία ή ιδιότητες και των δύο αντικειμένων.
  2. Υπερκαλύψτε το GetHashCode():

    • Δημιουργήστε έναν κωδικό κατακερματισμού βασισμένο στα ίδια σημαντικά πεδία ή ιδιότητες που χρησιμοποιούνται στο Equals.
    • Διασφαλίστε ότι αν το Equals επιστρέφει true για δύο αντικείμενα, οι μέθοδοι GetHashCode τους επιστρέφουν την ίδια τιμή.
    • Συνιστάται η ομοιόμορφη κατανομή των κωδικών κατακερματισμού για τη μείωση των συγκρούσεων.
  3. Προαιρετικά υλοποιήστε το 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 (βασισμένη σε αναφορά), που μπορεί να οδηγήσει σε λανθασμένη λειτουργία της συλλογής κατά την αναζήτηση κλειδιών βάσει τιμής.