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.
-
Überschreiben von
Equals(object obj):- Vergleichen Sie die aktuelle Instanz mit einem anderen Objekt (
obj) auf Gleichheit. - Stellen Sie sicher, dass
objnichtnullist. - Stellen Sie sicher, dass
objdenselben Typ wie die aktuelle Instanz hat. - Vergleichen Sie die relevanten Felder oder Eigenschaften beider Objekte.
- Vergleichen Sie die aktuelle Instanz mit einem anderen Objekt (
-
Überschreiben von
GetHashCode():- Generieren Sie einen Hash-Code basierend auf denselben relevanten Feldern oder Eigenschaften, die in
Equalsverwendet werden. - Stellen Sie sicher, dass, wenn
Equalsfür zwei Objektetruezurückgibt, ihreGetHashCode-Methoden denselben Wert zurückgeben. - Es ist ratsam, eine gleichmäßige Verteilung der Hash-Codes zu gewährleisten, um Kollisionen zu minimieren.
- Generieren Sie einen Hash-Code basierend auf denselben relevanten Feldern oder Eigenschaften, die in
-
Optional die Implementierung von
IEquatable<T>:- Bietet eine typisierte Methode
Equals(T other), die effizienter sein kann, da sie Boxing vermeidet.
- Bietet eine typisierte Methode
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.