SortedDictionary sortiert Sonderzeichen falsch

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Duplikat-Fehler: scheinbar erzeugt chr(i) aus verschiedenen Zahlen denselben Char?
    Das wäre dann aber nicht wirklich ein Fehler der Sortierung.

    Sequence-Error: ergibt sich daraus, dass der <-Operator eine annere (kulturabhängige) SortierReihenfolge zugrundelegt als OrdinalIgnoreCase.

    Wenn die Reihenfolge so wichtig ist, dann darfst du halt Strings nicht mehr < vergleichen, sondern nurnoch mit demselben StringComparer, den auch dieses Dictionary verwendet.

    Oder du schreibst einen eigenen StringComparer, der intern halt < verwendet.

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

    Na in dieser Reihenfolge werden die Werte in das SortedDictionary aufgenommen ... gemäß dem Vergleichsoperator ist die Reihenfolge aber absteigend.

    Mein Beitrag bezog sich auf das Posting von RFG - den Beitrag von EDR hatte ich da noch nicht gesehen.

    Zitat EDR:

    Wenn die Reihenfolge so wichtig ist, dann darfst du halt Strings nicht mehr < vergleichen, sondern nurnoch mit demselben StringComparer, den auch dieses Dictionary verwendet.

    Oder du schreibst einen eigenen StringComparer, der intern halt < verwendet.

    Beides erscheint mir eine mögliche Lösung zu sein. Nur wie mache ich das ? Welchen String Comparer verwendet denn das Dictionary? Oder wie schreibe ich einen eigenen StringComparer der intern < verwendet?

    LG
    Peter

    das mag sein.
    Also die Reihenfolge im SortedDic ist

    Quellcode

    1. Key | Value
    2. Ü | v
    3. Ñ | o
    4. Ç | d
    5. ß | t
    Wie in post21 gesagt: wenn das die OrdinalIgnoreCase-Reihenfolge ist, ist das ok.
    Und wenn du die Keys dann anders vergleichst als mit StringComparer.OrdinalIgnoreCase - etwa stattdessen mit <, dann unterscheiden sich die Reihenfolgen eventuell.
    (Falls ich deine Auflistung ühaupt richtig verstehe, für die Reihenfolge ist die rechte Spalte ja komplett irrelevant)
    Wie vergleiche ich denn Strings mit StringComparer.OrdinalIgnore Case?

    VB.NET-Quellcode

    1. Dim a as String = "hugo"
    2. Dim b as String = "susi"
    3. If a < b Then ...


    Wie muss ich jetzt die if clause abändern, um den StringComparer zu verwenden?

    LG
    Peter

    Peter329 schrieb:

    StringComparer
    Sieh Dir mal das an:

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Dim list As New SortedDictionary(Of String, String)(New MyComparer())
    3. list.Add("234321", "bb")
    4. list.Add("123456789", "aa")
    5. For Each kvp As KeyValuePair(Of String, String) In list
    6. MessageBox.Show(kvp.Key)
    7. Next
    8. End Sub

    VB.NET-Quellcode

    1. Public Class MyComparer
    2. Implements IComparer(Of String)
    3. Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
    4. Dim xx As String = x.Substring(0, 4)
    5. Dim yy As String = y.Substring(0, 4)
    6. Return xx.CompareTo(yy)
    7. End Function
    8. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Peter329 schrieb:

    Wie vergleiche ich denn Strings mit StringComparer.OrdinalIgnore Case?

    mit der StringComparer.Compare() - Methode:

    VB.NET-Quellcode

    1. Dim a as String = "hugo"
    2. Dim b as String = "susi"
    3. If StringComparer.OrdinalIgnoreCase.Compare(a , b)<0 Then ...
    Guck ma in' ObjectBrowser, ob du das dort nicht selbst hättest herauslesen können.
    So, da bin ich wieder. Erst mal herzlichen Dank an alle Ratgeber!

    Ich habe jetzt die Sache mit dem IComparer verstanden und nachvollzogen. Das war ein bissl Arbeit aber das Ergebnis ist für mich überwältigend:

    Quellcode

    1. Sequence errors: 0 Duplicate errors: 0 Total errors: 0


    Ich bin begeistert! Und mein Abgleich der Registry Extrakte flutsch jetzt endlich ohne Sequence Errors !

    Mein Dank gilt also ganz besonders RFG, der mir wieder mal, sehr präzise und zielgerichtet genau das vermittelt hat, was ich zur Problemlösung benötigt habe. Klasse!

    Wen es interessiert: mit meinem Programm kann ich jetzt in weniger als einer Sekunde zwei Registry Abzüge mit einigen 100.000 Einträgen abgleichen und sehe, welche Keys neu sind, gelöscht wurden oder sich geändert haben! Endlich kann ich anzeigen, wer was in meine Registry schreibt!

    Ihr habt mir sehr geholfen ! Vielen Dank noch einmal an alle Ratgeber.

    LG
    Peter

    ErfinderDesRades schrieb:

    also du hast jetzt einen eigenen StringComparer gecodet, und nimmst nicht mehr einen der vorgefertigten?


    Yip ... so klingt das und so isses auch. Ich habe einen Comparer auf Basis des Vergleichsoperators geschrieben. Und das funktioniert nicht nur fehlerfrei, sondern zeigt auch keinen messbaren Overhead.

    LG
    Peter