Sobes.tech
Middle

Was muss getan werden, um eine Klasse als Schlüssel in einer Sammlung zu verwenden?

sobes.tech KI

Antwort von AI

Um eine Klasse als Schlüssel in einer Sammlung zu verwenden (z.B. in Dictionary<TKey, TValue>), ist es notwendig, die Methoden Equals und GetHashCode korrekt zu implementieren.

  1. Überschreiben von Equals(object obj):

    • Vergleichen Sie die aktuelle Instanz mit einem anderen Objekt (obj) auf Gleichheit.
    • Stellen Sie sicher, dass obj nicht null ist.
    • Stellen Sie sicher, dass obj denselben Typ wie die aktuelle Instanz hat.
    • Vergleichen Sie die relevanten Felder oder Eigenschaften beider Objekte.
  2. Überschreiben von GetHashCode():

    • Generieren Sie einen Hash-Code basierend auf denselben relevanten Feldern oder Eigenschaften, die in Equals verwendet werden.
    • Stellen Sie sicher, dass, wenn Equals für zwei Objekte true zurückgibt, ihre GetHashCode-Methoden denselben Wert zurückgeben.
    • Es ist ratsam, eine gleichmäßige Verteilung der Hash-Codes zu gewährleisten, um Kollisionen zu minimieren.
  3. Optional die Implementierung von IEquatable<T>:

    • Bietet eine typisierte Methode Equals(T other), die effizienter sein kann, da sie Boxing vermeidet.

Beispiel:

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;
    }

    // Überschreiben von Equals für Wertvergleich
    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;
    }

    // Überschreiben von GetHashCode unter Verwendung derselben Felder
    public override int GetHashCode()
    {
        // Verwendung von Tuple zur Kombination der Hash-Codes
        return (Id, Name).GetHashCode();
    }

    // Optional die Implementierung von IEquatable<T>
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Ohne eine korrekte Implementierung dieser Methoden verwendet Dictionary standardmäßig die Identität (Referenzgleichheit) und die Standard-Implementierung von GetHashCode (basierend auf der Referenz), was zu inkorrektem Verhalten bei der Suche nach Schlüsseln anhand ihres Werts führen kann.