Rozumiem, że nie zaleca się używania obiektów "zmiennych" (obiektów, których metoda GetHashCode() może zwracać różne wyniki, gdy są one używane jako klucze w Dictionary).Sposób implementacji słownika .NET działa z obiektami zmiennymi
Poniżej jest moje zrozumienie, jak słownik, który jest realizowany w tabeli mieszania, działa:
Kiedy dodaję nowy klucz, na przykład dict.Add(m1, "initially here was m1 object");
, dict
oblicza hashcode z m1
używając metody GetHashCode()
. Następnie wykonuje pewne wewnętrzne obliczenia i ostatecznie umieszcza ten obiekt w pewnej pozycji swojej wewnętrznej tablicy.
Kiedy używam indeksu klucza, aby uzyskać wartość, na przykład dict[m1]
, dict
ponownie oblicza kod skrótu. Następnie wykonuje pewne wewnętrzne obliczenia i daje mi obiekt, który znajduje się w obliczonej pozycji wewnątrz swojej wewnętrznej tablicy.
Ale myślę, że jest błąd, którego nie mogę znaleźć.
Więc pozwala założyć, że mam ten kod:
class MutableObject
{
Int32 m_value;
public MutableObject(Int32 value)
{
m_value = value;
}
public void Mutate(Int32 value)
{
m_value = value;
}
public override int GetHashCode()
{
return m_value;
}
}
static void Main(string[] args)
{
MutableObject m1 = new MutableObject(1);
MutableObject m2 = new MutableObject(2);
var dict = new Dictionary<MutableObject, String>();
dict.Add(m1, "initially here was m1 object");
dict.Add(m2, "initially here was m2 object");
Console.WriteLine("Before mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
m1.Mutate(2);
m2.Mutate(1);
Console.WriteLine("After mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
Console.ReadKey(true);
}
Kiedy zadzwonić Mutate
metody, klucze są zamienione. Pomyślałem więc, że da to zamienione wyniki. Ale w rzeczywistości ta linia: Console.WriteLine("dict[m1] = " + dict[m1]);
wyrzuca KeyNotFoundException i nie mogę zrozumieć, dlaczego. Oczywiście brakuje mi tutaj ...
Istnieją tylko cztery miliardy możliwych kodów skrótów. Przypuśćmy, że po prostu przez nieszczęście masz dwa nierówne obiekty w tej samej tabeli mieszania z tym samym kodem mieszającym. * W jaki sposób słownik odróżnia je od siebie? Kiedy odpowiesz na to pytanie, zrozumiesz, dlaczego program daje wyniki, które widzisz. –
Wiem, że hasttable może implementować łańcuchowe lub otwarte algoryty, np. Do walki z kolizjami. Więc kiedy wzywam 'dict [m1]' otrzymuje kod skrótu, równa się 2 po zamianie, a następnie ... co robi? Próbuje dowiedzieć się, który przedmiot z tym hashkodem ma rację, a który z nich powinien powrócić ... – acrilige
Kupujesz dom przy 1 Elm Street, potem kupujesz dom przy ul Elm 2 i tam się przenosisz. Zmieniasz znak adresowy w drugim domu na 1 ulicę Wiązów. Gdzie dostaniesz pocztę na ulicę Elm? –