Laden...

Warum berücksichtigt GetHashCode() von int [] nicht den Inhalt des Arrays?

Erstellt von Richter vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.070 Views
R
Richter Themenstarter:in
104 Beiträge seit 2006
vor 13 Jahren
Warum berücksichtigt GetHashCode() von int [] nicht den Inhalt des Arrays?

Wie der Titel schon sagt, warum gibt GetHashCode eines Integerarrays immer etwas anderes zurück, obwohl alle Elemente zweier Arrays gleich sind?

Das hat sicherlich einen Logischen Grund, den ich gerne Verstehen würde!

Bei Strings funktioniert es doch auch! Und das sind ja quasi auch nur CharArrays?

Muss man solchen Lowlevelsachen bei den Standarddatentypen also immer erst Implementieren, wenn man irgend eine Datenstrucktur in einer Hashtable als Key nutzen will?

Nevu - Intelligente Maschinen, die Zukunft alles rund um das Thema Künstliche Intelligenz!

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Richter,

die Aussage im bisherigen Titel "Warum implementiert int[] kein ordentliches GetHashCode() von Natur aus?" ist unzutreffend. GetHashCode von int[] ist ordentlich definiert. Deshalb habe ich den Titel geändert.

GetHashCode muss immer kompatibel mit Equals sein. Und int[].Equals vergleicht (sinnvollerweise) eben nicht die Inhalte das Arrays. Also kann auch GetHashCode nicht die Inhalte berücksichtigen.

Das das bei Strings anders ist, liegt an den Besonderheiten der String-Klasse. Siehe [FAQ] Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik).

Wenn du einen Key brauchst, der aus mehreren ints besteht, dann solltest du dafür eine passende Klasse mit passendem GetHashCode und passendem Equals schreiben.

herbivore

3.971 Beiträge seit 2006
vor 13 Jahren

Die Standardimplementierung von Equals und GetHashCode arbeiten immer mit Referenzgleichheit. Bei Arrays macht es keinen Sinn, die Standardimplementierung zu ändern, da Arrays sehr groß sein können und anschließend immer das komplette Array durchlaufen werden muss.

Wenn du eine andere Implementierung in Dictionaries nutzen möchtest, erstell dir eine Klasse die IEqualityComparer-Member implementiert.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

R
Richter Themenstarter:in
104 Beiträge seit 2006
vor 13 Jahren

Danke, ich habe verstanden!

Nevu - Intelligente Maschinen, die Zukunft alles rund um das Thema Künstliche Intelligenz!