Hashtable Bug - Fix?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Hashtable Bug - Fix?

    Hallo,
    ich glaube ich habe einen Bug in der Hashtable gefunden.

    VB.NET-Quellcode

    1. Dim hashtable As New Hashtable
    2. hashtable.Add("a", "1")
    3. hashtable.Add("b", "2")
    4. hashtable.Add("c", "3")
    5. hashtable.Add("d", "4")
    6. hashtable.Add("e", "5")
    7. hashtable.Add("f", "6")
    8. hashtable.Add("g", "7")
    9. hashtable.Add("h", "8")
    10. hashtable.Add("i", "9")
    11. hashtable.Add("j", "10")


    Schaut euch danach mal die Hashtable an. Es wurden zwar alle Einträge übernommen, aber die Reihenfolge ist wild. Das stellt bei meinem derzeitigen Projekt ein großes Problem dar. Gibt es dafür einen Fix ?

    MfG
    Hey /dev/null,

    ich weiß zwar nicht woran es liegt, dass die Werte nicht der Reihenfolge nach gespeichert werden, aber ich wüsste jetzt auch nicht warum es hier so wichtig sein soll. Du greifst doch über einen "Schlüssel" auf den jeweiligen Wert zu. Da ist es doch egal an welcher Stelle sich der Wert in der Hashtable befindet. Erklär mal genau warum die Reihenfolge für dich so wichtig ist.
    Ein php-Script berechnet auf einem Webserver die Values und übergibt sie mir. Das Resultat, das aus den Values hervorgeht wird auf dem Webserver ebenfalls gespeichert und mir übergeben. Entscheidend ist dann die richtige Darstellung auf meinem Clienten, damit das Resultat, das zuvor vom Webserver übergeben wurde, mit denen im Clienten angezeigen Keys übereinstimmt und das Ganze für den User sinn ergibt.

    Ist etwas kompliziert, jedenfalls ist es notwendig (außer ich schreibe mein komplettes Programm neu um) für mein Programm, dass die Reihenfolge stimmt. Ein Fix wäre super.
    Ein Dictionary würfelt nicht durcheinander:

    VB.NET-Quellcode

    1. Dim dic As New Dictionary(Of String, String)
    2. dic.Add("a", "1")
    3. dic.Add("b", "2")
    4. dic.Add("c", "3")
    5. dic.Add("d", "4")
    6. dic.Add("e", "5")
    7. dic.Add("f", "6")
    8. dic.Add("g", "7")
    9. dic.Add("h", "8")
    10. dic.Add("i", "9")
    11. dic.Add("j", "10")
    hashtable ist veraltet (untypisiert - noch aus Zeiten von vb2003), und sollte nie mehr benutzt werden. Nimm Dictionary.

    Möglicherweise enthält dein ganze Projekt noch weitere veraltete Elemente, sowohl was benutzte Klassen angeht, als auch in Bezug auf Sprachkonstrukte.
    Mit Framework2.0 und vb2008 sind Generica in die Sprache eingezogen, mit denen man sehr elegant typsicher programmiert, sodaß der veraltete untypisierte Stil von 2003 als Code-Horror angesehen wern muß.
    gugge auch böse Funktionen

    Ansonsten: Dictionary ist eine weiterentwickelte Hashtable, also verwendet dasselbe performante Indizierungs-Prinzip, aber typisiert. Das eigliche HashTable-Prinzip stellt keine definierte Reihenfolge bereit, aber freundlicherweise habenses bei Dictionary doch iwie eingebaut.

    Enixus schrieb:

    Ein Dictionary würfelt nicht durcheinander
    Bist du sicher?

    Ein Dictionary-Eintrag wird normalerweise über den Key adressiert.
    Dafür macht man ja das Ganze.

    Dass die Keys in der Datenstruktur in einer bestimmten Reihenfolge abgelegt sein müssen, ist meines Wissens nirgends definiert.

    Bei einer Collection kannst du mit Add bzw. Insert steuern, an welcher Stelle ein neues Element eingefügt wird, bei einem Dictionary sehe ich die Möglichkeit nicht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    petaod schrieb:

    Ein Dictionary-Eintrag wird normalerweise über den Key adressiert.
    Dafür macht man ja das Ganze.

    Das stimmt so.
    Wenn man allerdings mal durch das Dictionary Durch-Foreacht, dann stellt man fest, dass die KeyValuePairs in genau der gleichen Reihenfolge kommen, wie sie zum Dictionary hinzugefügt wurden. Deshalb kann man ein Dictionary (z.B. über die Linq) auch sortieren.
    Von meinem iPhone gesendet
    Ich glaube schon, dass das normalerweise sequentiell hintereinander liegt.
    Aber ob das Zufall ist und auch mal anders sein kann, weiß ich nicht.

    Klar lässt sich mit Linq sortieren, aber da kann ich auch ungeordnete Datenstrukturen sortiert ausgeben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. Dim d As New Dictionary(Of String, Integer)
    2. d.Add("A", 1)
    3. d.Add("D", 4)
    4. d.Add("B", 2)
    5. d.Remove("D")
    6. d.Add("C", 3)
    7. For Each o In d
    8. Debug.Print(o.Key & " - " & o.Value)
    9. Next

    Gelle ...

    Weil (.Net Reflector):

    Quellcode

    1. int num = this.comparer.GetHashCode(key) & 0x7fffffff;
    2. int index = num % this.buckets.Length;
    3. for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next)
    4. {
    5. if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
    6. {
    7. if (add)
    8. {
    9. ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
    10. }
    11. this.entries[i].value = value;
    12. this.version++;
    13. return;
    14. }
    15. }