Middle
Mida tuleb teha, et klassi kasutada võtmena kogumis?
sobes.tech AI
Vastus AI-lt
Kui soovite kasutada klassi võtmena kogumis (näiteks Dictionary<TKey, TValue>), on oluline õigesti rakendada Equals ja GetHashCode meetodid:
-
Overrideda
Equals(object obj):- Võrrelda praegust eksemplari teise objektiga (
obj) võrdluseks. - Veenduda, et
objei olenull. - Veenduda, et
objon sama tüüpi kui praegune eksemplar. - Võrrelda mõjukamaid välju või omadusi mõlemas objektis.
- Võrrelda praegust eksemplari teise objektiga (
-
Overrideda
GetHashCode():- Genereerida hash-kood samade oluliste väljade või omaduste põhjal, mis on kasutusel
Equals-is. - Tagada, et kui
Equalstagastabtruekahe objekti jaoks, siis nendeGetHashCodemeetodid tagastavad sama väärtuse. - Tagada ühtlane hash-koodide jaotus, et vähendada kokkupõrkeid.
- Genereerida hash-kood samade oluliste väljade või omaduste põhjal, mis on kasutusel
-
Valikuliselt rakendada
IEquatable<T>:- Pakkuda tüüpilist
Equals(T other)meetodit, mis võib olla tõhusam, vältides boxingut väärtustüüpide puhul.
- Pakkuda tüüpilist
Näide:
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;
}
// Overrideda `Equals` väärtuste võrdluseks
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;
}
// Overrideda `GetHashCode`, kasutades samu välju
public override int GetHashCode()
{
return (Id, Name).GetHashCode();
}
// Valikuliselt rakendada `IEquatable<MyKey>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Ilma nende meetodite õige rakendamiseta kasutab Dictionary vaikimisi identiteedi võrdlust (viitide võrdlus) ja GetHashCode vaikimisi rakendust (viidil põhinev), mis võib põhjustada kole kole kogumise ebatäpset tööd väärtuse järgi otsimisel.