IComparer vs. IComparable

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    IComparer vs. IComparable

    Hi,

    ich versuche in einer DatagridView die Sortierreihenfolge für Vokale mit Akzenten einer Spalte zu verändern. Die übliche Reihenfolge etwa a < á < à soll verändert werden (das ist für meine Anwendung sehr wichtig).

    Ich scheitere schon an den Begrifflichkeiten: IComparer und IComparable ... was ist denn der Unterschied .... und was sollte ich hier am Besten verwenden ?

    Ich hab dann mal ÜBUNGSHALBER eine ICOMPARER Klasse definiert, die einfach case insensitive + ignore apostrophes vergleichen soll ...

    VB.NET-Quellcode

    1. Public Class CLApostCompare
    2. Implements IComparer(Of String)
    3. Public Shared ReadOnly Instance As New CLApostCompare
    4. Pulic Sub New()
    5. End Sub
    6. Public Function Compare(ByVal KeyOld As String, ByVal KeyNew As String) As Integer _
    7. Implements System.Collections.Generic.IComparer(Of String).Compare
    8. 'Ignore case and apostrophes
    9. Dim myOldKey = RemoveApost(KeyOld.ToUpper)
    10. Dim myNewKey = RemoveApost(KeyNew.ToUpper)
    11. If myOldKey < myNewKey Then Return -1
    12. If myOldKey > myNewKey Then Return 1
    13. Return 0
    14. End Function
    15. '-------------------------------------------------------------------------------------------------------------------
    16. ' ICOMPARER routines
    17. '-------------------------------------------------------------------------------------------------------------------
    18. Public Function RemoveApost(strInput As String) As String
    19. Const strAccentList As String = "áéíóúÁÉÍÓÚ" 'Accent list
    20. Const strBaseList As String = "aeiouAEIOU" 'Base list
    21. Dim myInput = ""
    22. For i = 0 To strInput.Length - 1
    23. Dim myDigit = strInput.Substring(i, 1)
    24. Dim k = strAccentList.IndexOf(myDigit)
    25. If k > -1 Then myDigit = strBaseList.Substring(k, 1)
    26. myInput &= myDigit
    27. Next
    28. Return myInput
    29. End Function
    30. End Class


    Das ist soweit syntaktisch ok.

    Aber wie baue ich das jetzt in meine SortDatagridview Logik ein ?


    So habe ich das versucht:

    Visual Basic-Quellcode

    1. Dim myComparer = New CLApostCompare
    2. dgvDictionary.Sort(myComparer)


    Das scheitert mit der Fehlermeldung "implicit Konversion from CLApostCompare to Icomparer" ...

    Was mache ich denn falsch ? Und bin ich überhaupt auf der richtigen Schiene ?

    Ich hoffe, man kann mir (nachsichtig) helfen ....

    LG
    Peter

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

    @Peter329 Das DGV will allgemein sortiert werden, nicht mit IComparer(Of string).
    Es kann ja sein, dass Du auch Integer-Spalten oder so im DGV hast, die musst Du dann abfangen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class CLApostCompare
    2. Implements IComparer
    3. Public Function Compare(ByVal KeyOld As Object, ByVal KeyNew As Object) As Integer Implements IComparer.Compare
    4. 'Ignore case and apostrophes
    5. Dim myOldKey = RemoveApost(KeyOld.ToString)
    6. Dim myNewKey = RemoveApost(KeyNew.ToString)
    7. Return myOldKey.CompareTo(myNewKey)
    8. End Function
    9. '-------------------------------------------------------------------------------------------------------------------
    10. ' ICOMPARER routines
    11. '-------------------------------------------------------------------------------------------------------------------
    12. Public Function RemoveApost(strInput As String) As String
    13. Const strAccentList As String = "áéíóúÁÉÍÓÚ" 'Accent list
    14. Const strBaseList As String = "aeiouAEIOU" 'Base list
    15. Dim myInput = ""
    16. For i = 0 To strInput.Length - 1
    17. Dim myDigit = strInput.Substring(i, 1)
    18. Dim k = strAccentList.IndexOf(myDigit)
    19. If k > -1 Then myDigit = strBaseList.Substring(k, 1)
    20. myInput &= myDigit
    21. Next
    22. Return myInput
    23. End Function
    24. 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!
    Aber die Gleichmacherei hilft da doch nicht weiter. Es soll ja eine individuelle Reihenfolge innerhalb der akzenthaltigen-akzentfreien Volkalvarianten erstellt werden. Daher ist die Übung nett, aber nicht zielführend.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also die Änderungen der Klasse funktionieren auf Anhieb. Die Kompilerfehlermeldungen sind behoben.

    Leider klappt das mit dem Sortieren nicht - es kommt eine "wirre" Reihenfolge heraus !

    Ich hab mir das im Debugger angeschaut. Hier passiert das Unglück:

    VB.NET-Quellcode

    1. Public Function Compare(ByVal KeyOld As Object, ByVal KeyNew As Object) As Integer Implements IComparer.Compare
    2. Dim myOldKey = RemoveApost(KeyOld.ToString.ToUpper)
    3. Dim myNewKey = RemoveApost(KeyNew.ToString.ToUpper)
    4. If myOldKey < myNewKey Then Return -1
    5. If myOldKey > myNewKey Then Return 1
    6. Return 0
    7. End Function


    KeyOld und KeyNew werden as DATAGRIDVIEWROW {Index=...} angeliefert ... Der Vergleich liefert natürlich Schrott ....

    Ich benötige aber zum Vergleich den Wert einer bestimmten Zelle in der Spalte "itmForeign" ... wie kann ich denn darauf zugreifen ? Den Index der Spalte kenne ich natürlich. Aber ich benötige natürllich auch den RowIndex der Zeile ...

    So hab ich den Zugriff versucht:

    VB.NET-Quellcode

    1. Dim i1 = KeyOld.Index


    Das liefert die Fehlermeldung "late binding not allowed" ..

    Bin Ich überhaupt noch auf dem richtigen Weg ? Wie kann ich KeyOld und KeyNew etwa mit DirectCast in eine Row meiner DataGridView umwandeln ? Macht das überhaupt Sinn ?

    LG
    Peter


    VaporiZed schrieb:

    Aber die Gleichmacherei hilft da doch nicht weiter. Es soll ja eine individuelle Reihenfolge innerhalb der akzenthaltigen-akzentfreien Volkalvarianten erstellt werden. Daher ist die Übung nett, aber nicht zielführend.


    Das ist mir schon klar. Deswegen habe ich ja auch ausdrücklich ÜBUNGSHALBER geschrieben: ich will halt erst mal sehen, wie man so einen ICOMPARER überhaupt zum Laufen kriegt ... step by step ... ich hoffe, wir sind jetzt auf der gleichen Wellenlänge.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Hier passiert das Unglück
    Wasd für ein Unglück?
    Und:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Return myOldKey.CompareTo(myNewKey)
    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!
    Hi.

    So wie ich das verstanden habe, ist IComparable nur für den Vergleich zwischen einem Eigenschaftswert (z.B. Name) und IComparer kann mehrere Eigenschaften zweier Objekte vergleichen.

    CompareTo() für den einfachen Vergleich...

    Hingegen beim IComparer muss dann das Vergleichen selbst implementiert werden.

    Angenommen ein kombinierter Vergleich wird benötigt.
    Name und Alter sollen verglichen werden.

    Dann definiert Mann/Frau/Divers, was soll als Gleichwertig, Höherwertig oder Niederwertig werden. (Verdammte Sprache ist sowas von "Not Including". )

    Das 15 mal der Name "Harald" auftaucht ist ja ok, aber dann noch nach Geburtsdatum...

    Was dann gemacht wird,
    ist zu Beispielhaft sagen:
    NameA=NameB und GebDatumA<GebDatumB=-1,
    NameA=NameB und GebDatumA=GebDatumB=0,
    NameA=NameB und GebDatumA>GebDatumB=1.

    Ob die Zahlen und die Vergleiche hier stimmen kann ich nicht sagen, hab ich mir ausgedacht. :)

    Es gibt noch eine eingebaute Variante im DataGridView:
    docs.microsoft.com/de-de/dotne…w=netframeworkdesktop-4.8

    Ist eine andere Art, die Daten zu sortieren, soll das DataGridView es selbst machen... ;)
    Hier ist die Sortierung nur in der UI/DGV und die Sortierung ist ad hoc, und muss nicht vorab selbst gemacht werden. (Sort of..)

    Damit kann dann zudem gefiltert und gruppiert werden.

    Es wird die Sammlung (Daten-Liste) in eine CollectionViewSource gepackt und diese wird dann im UI anders dargestellt, als in der (realen) Liste.

    Ist etwas Einarbeitung, aber es ist sehr schnell...

    c.u. Joshi aus HH :)
    Vielen Dank erst mal an die Ratgeber.

    @Joshi: schöne Erklärung für den Unterschied zwischen IComparer und IComparable.

    @RFG: Jau ... das mit Return myOldKey.CompareTo(myNewKey) hatte ich abgeändert und den Rückgabewert (-1, 0, 1) selbst "errechnet". Ich hab die Anweisung jetzt geändert, das macht aber keinen Unterschied ...

    RodFromGermany schrieb:

    Was für ein Unglück?


    Das Unglück besteht darin, dass die Sortierreihenfolge nicht stimmt !

    So rufe ich den Sortierer aus der Eventprozedur dgvDictionary.ColumnHeaderMouseClickauf:

    VB.NET-Quellcode

    1. Private Sub SortDictionary(myColumn As DataGridViewTextBoxColumn)
    2. If myColumn Is itmForeign Then
    3. MessageBox.Show(myColumn.ToString & " - " & myDirection.ToString)
    4. Dim myComparer = New CLApostCompare
    5. dgvDictionary.Sort(myComparer) 'das funktioniert NICHT
    6. Else
    7. dgvDictionary.Sort(myColumn, myDirection) 'das funktioniert
    8. End If
    9. End Sub


    Ich habe zwei Screenshots angehängt: eines vom Sortieren der Spalte itmForeign (ColumnHeader "Tagalog" und eins von der Spalte itmBase (ColumnHeader "English"). Welche Spalte sortiert wurde erkennt man am SortGlyph ... und wie man sieht klappt die Sortierung der Spalte "English", mit der Anweisung

    VB.NET-Quellcode

    1. dgvDictionary.Sort(myColumn, myDirection)


    Das Sortieren der Spalte "Tagaglog" mit der Anweisung

    VB.NET-Quellcode

    1. Dim myComparer = New CLApostCompare
    2. dgvDictionary.Sort(myComparer) 'das funktioniert NICHT


    klappt nicht. Da wird nach irgend etwas ganz anderem sortiert. Und das ist für mich ein Unglück. :)

    Übrigens: Wenn ich die Sache mit dem IComparer wieder herausnehme und in jedem Fall mit dem "normalen" Sort arbeite, klappt die Sortierung auch für die Spalte "Tagalog".

    Ich hoffe, ich habe mein Problem verständlich machen können.

    Kann mir jemand einfühlsam auf die Sprünge helfen ? Ich hab den Verdacht, dass ich dem IComparer noch irgendwie die Sortierspalte und Richtung mitgeben muss ...

    LG
    Peter
    Bilder
    • s 2022-06-03 06-46-324.jpg

      37,04 kB, 494×356, 55 mal angesehen
    • s 2022-06-03 06-45-317.jpg

      40,67 kB, 494×356, 50 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Zwischenfrage:
    Wie soll denn die Reihenfolge sein, wenn die Scheibweise sich durch einen Akzent nicht stimmt und die Länge anders ist, also bei
    • FoóBar
    • Foo
    • Foó
    • FooBar
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Genau.

    Peter329 schrieb:

    Das Unglück besteht darin, dass die Sortierreihenfolge nicht stimmt !
    Gib mal ein Beispiel wie es ist und wie es sein soll.
    Wahrscheinlich musst Du die Sortierung selbst noch verfeinern.
    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!
    Ach ja, nochmal anderweitig zusammenfassende Worte zum Unterschied zwischen IComparable und IComparer:
    Ein IComparable-Implementierer ist eine Klasse, die dafür sorgt, dass eine eigene Instanz mit anderen Instanzen derselben Klasse verglichen werden kann (also passiv).
    Ein IComparer-Implementierer ist ein aktiver, aber externer Sortierer anderer Objekte.

    ##########

    Und noch eine Nachfrage: Groß-/Kleinschreibung ignorieren oder priorisieren? Was soll hier rauskommen:
    • abc
    • ABC
    • abc1
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @RFG

    Schau dir doch einmal die Ausgabe der sortierten Spalte "Tagalog" an ... die soll aufsteigend sein ... die ersten drei Zeilen beginnen aber mit

    n(inyo)
    i(yo)
    p(angako)

    n - i - p

    das ist mal absteigend und mal aufsteigend ... also mit Sicherheit nicht sortiert ! Ich hoffe, dass jetzt klar ist, warum ich mit dieser Reihenfolge nicht zufrieden bin ... Erwartet hätte ich folgende Reihenfolge:

    iyo
    ninyo
    pangako

    Tatsächlich ist die Sortierreihenfolge für ALLE Zeilen vollkommen konfus. Ich hab das Gefühl, da wird nach einer ganz anderen Spalte sortiert (ich zeige nicht alle Spalten der DGV an!)

    Deshalb ja auch mein Verdacht, dass man dem ICOMPARE Sortierspalte und Reihenfolge irgendwie mitliefern muss ... ich sortiere durch Funktionsaufruf

    VB.NET-Quellcode

    1. SortDictionary(...)
    , möglicherweise sind die Angaben bzgl. der Sortierspalte nur in der Ereignisprozeder dgvDictionary.ColumnHeaderMouseClick verfügbar ... und es wird per Default eine andere Spalte angezogen. Beim Aufruf für den Sort der Spalte "Englisch" liefere ich die Angabe mit:

    VB.NET-Quellcode

    1. dgvDictionary.Sort(myColumn, myDirection)


    und da funktioniert das ja dann auch mit dem Sortieren.

    Der Aufruf über den IComparer lässt aber keine weiteren Variablen zu. Das scheint mir hier das Problem zu sein.

    Ich hoffe, dass es mir jetzt gelungen ist, mein Problem verständlich zu machen.

    LG
    Peter

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

    Ich hab das jetzt mal so gemacht, dass ich einen DGV-spezifischen, einen untypisierten und einen typisierten Comparer erstellt habe. Der DGV-spezifische ist für die DGV.Sort-Methode und ruft die typisierte Variante auf, welche auch für einen List(Of T)-Sort verfügbar ist. Das Ganze ist zweifellos sehr anpassungs- und ausbaufähig. Aber vielleicht als Ansatz.

    Die Sortierreihenfolge dabei wurde für die O-Varianten angegeben mit ôóòöo
    Bilder
    • Result.png

      12,22 kB, 600×466, 56 mal angesehen
    Dateien
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Peter329 schrieb:

    die soll aufsteigend sein
    Das ist doch das wenigste:

    VB.NET-Quellcode

    1. Return myOldKey.CompareTo(myNewKey)

    oder

    VB.NET-Quellcode

    1. Return myNewKey.CompareTo(myOldKey)

    probier einfach aus.
    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!
    @RFG: Ich hab das Gefühl, du verstehst mich nicht.

    Die zurückgelieferte Reihenfolge ist VÖLLIG durcheinannder ! Schau dir doch die "sortierte" Spalte "Tagalog" einfach mal an ! Was soll denn da das Vertauschen der Vergleichsoperanden bringen ?

    Natürlich hab ich das ausprobiert - aber erwartungsgemäß hat das nichts gebracht. Die Reihenfolge ist dann halt anders verstrubbelt !

    Also: der Sort mit dem IComparer klappt nicht. Egal ob ich

    VB.NET-Quellcode

    1. Return myNewKey.CompareTo(myOldKey)


    oder

    VB.NET-Quellcode

    1. Return myOldKey.CompareTo(myNewKey)


    kodiere ! Die Reihenfolge ist verstrubbelt !

    Ich hätte gedacht, dass man die Eigenschaften

    dgvDictionary.SortedColumn
    dgvDictionary.SortOrder

    befüllen muss. Die stehen nämlich beide auf NOTHING ... !

    Die Anweisungen:

    VB.NET-Quellcode

    1. dgvDictionary.SortOrder = CurrentSortOrder
    2. dgvDictionary.SortedColumn = CurrentSortedColumn


    scheitern aber, weil beide Eigenschaften "ReadOnly" sind. Die werden wohl vom SORT befüllt und sind nicht als Eingabeeigenschaften gedacht !

    Ich hab keine Ahnung wonach der Klick auf den Column Header der Spalte "Tagalog" mit dem IComparer sortiert ! Jedenfalls ist es nicht das, was ich benötige.

    Ich hoffe, dass ich JETZT mein Anliegen verständlich machen konnte.

    LG
    Peter

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    die Eigenschaften
    dgvDictionary.SortedColumn
    dgvDictionary.SortOrder
    definieren das Default-Verhalten eines DGV, wenn Du auf die Header-Zeile klickst.
    Setze einen Haltepunkt in die Compare-Routine und stelle fest, was nicht funktioniert.
    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: Mein Testprojekt in Post#12 und meine offenen Fragen in den Posts davor hattest Du gesehen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RFG: Na ... das mit dem Debugger habe ich natürlich schon zuvor versucht:

    VB.NET-Quellcode

    1. Public Function Compare(ByVal KeyOld As Object, ByVal KeyNew As Object) As Integer Implements IComparer.Compare 'Ignore case and apostrophes
    2. Dim myOldKey = RemoveApost(KeyOld.ToString.ToUpper)
    3. Dim myNewKey = RemoveApost(KeyNew.ToString.ToUpper)
    4. Dim retval = myOldKey.CompareTo(myNewKey)
    5. Debug.Print(myOldKey.ToString & " - " & myNewKey.ToString & " --> " & retval.ToString)
    6. Return retval <-- Break point
    7. End Function


    Diese Routine wird ohne jeden Fehler durchlaufen. Der Code der Routine CompareTo wird allerdings NICHT angezeigt.

    Die Debugger Ausgaben sind wegen meiner Debug.Print Anweisungen natürlich endlos ... hier sind die ersten Zeilen:

    Quellcode

    1. DATAGRIDVIEWROW { INDEX=0 } - DATAGRIDVIEWROW { INDEX=341 } --> -1
    2. DATAGRIDVIEWROW { INDEX=0 } - DATAGRIDVIEWROW { INDEX=682 } --> -1
    3. DATAGRIDVIEWROW { INDEX=341 } - DATAGRIDVIEWROW { INDEX=682 } --> -1
    4. DATAGRIDVIEWROW { INDEX=1 } - DATAGRIDVIEWROW { INDEX=341 } --> -1
    5. DATAGRIDVIEWROW { INDEX=341 } - DATAGRIDVIEWROW { INDEX=681 } --> -1
    6. DATAGRIDVIEWROW { INDEX=2 } - DATAGRIDVIEWROW { INDEX=341 } --> -1
    7. DATAGRIDVIEWROW { INDEX=341 } - DATAGRIDVIEWROW { INDEX=680 } --> -1
    8. DATAGRIDVIEWROW { INDEX=3 } - DATAGRIDVIEWROW { INDEX=341 } --> -1
    9. DATAGRIDVIEWROW { INDEX=341 } - DATAGRIDVIEWROW { INDEX=679 } --> -1
    10. DATAGRIDVIEWROW { INDEX=4 } - DATAGRIDVIEWROW { INDEX=341 } --> 1
    11. DATAGRIDVIEWROW { INDEX=5 } - DATAGRIDVIEWROW { INDEX=341 } --> 1
    12. DATAGRIDVIEWROW { INDEX=6 } - DATAGRIDVIEWROW { INDEX=341 } --> 1
    13. DATAGRIDVIEWROW { INDEX=7 } - DATAGRIDVIEWROW { INDEX=341 } --> 1
    14. DATAGRIDVIEWROW { INDEX=8 } - DATAGRIDVIEWROW { INDEX=341 } --> 1
    15. ...


    Welchen genauen Inhalt "myOldKey" bzw. "myNewKey" haben, das würde ich gern wissen ... habe aber keine Ahnung wie ich das anzeigen kann.

    Wie die Routine "CompareTo" mal zum Ergebnis "-1" und mal zum Ergebnis "+1" kommt, würde ich gern nachvollziehen ... habe aber keine Ahnung wie ich diese Routine debuggen soll, weil sie irgendwo im Innern von .Net angesiedelt ist. Und die Frage ist, ob das überhaupt viel Erkenntnisgewinn bringt ...

    Generell frage ich mich, woher die Routine "CompareTo" eigentlich wissen soll, nach welcher Spalte ich sortieren will ?

    Fragen über Fragen ... und so sehr ich deine Antworten im Allgemeinen auch schätze, diesmal scheinst du bei aller Wertschätzung nicht so richtig motiviert zu sein. Möglicherweise sogar ein bissl genervt. Und natürlich möchte ich deine Freundlichkeit und Hilfbereitschaft nicht überstrapazieren und dich mit meinen Problemchen über Gebühr behelligen. Ich bitte also um ein offenes Wort ... ich versuche zwar immer einen Lösungweg erst einmal konsequent bis zum Ende zu gehen ... aber wenn sich das als aussichtslos erweist, dann würde ich lieber neue Lösungsansätze versuchen.

    @Vaporized: Jau ... dein Sample Projekt habe ich gesehen und natürlich auch durchgelesen ... ganz herzlichen Dank für deine Mühe, das war natürlich sehr freundlich von dir !

    Ich hab es ja gerade geschrieben ... ich möchte erst einmal versuchen, meine elementaren Fragen mit dem aktuellen Ansatz zu klären ... aber wenn das zu nichts führt, dann würde ich einen Schritt zurück gehen, ein TestProjekt mit überschaubaren Daten anlegen und versuchen etwa mit deinen Vorschlägen
    das Problem zu erschlagen.

    Auch deine offenene Fragen habe ich gelesen. Aber ich möchte zunächst erst einmal den vermaledeiten IComparer zu Laufen bringen - da reicht es mir mit ignore case + ignore apostrophes zu arbeiten ... um die Feinheiten der Sortierreihenfolge werde ich mich erst im Anschluss daran kümmern. (step by step hab ich das genannt :) )

    Wenn man zu viele Dinge parallel beginnt, dann kann man sich leicht im Dickicht der Probleme verhaspeln ... Also ... deine Vorschläge sind auf fruchtbaren Boden gefallen... nur braucht jede Saat ein wenig Zeit bis sie aufgeht ... :)

    LG
    Peter

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    habe aber keine Ahnung wie ich das anzeigen kann.
    rechte Maustaste => Überwachung hinzufügen
    oder HOver über der Variable
    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:

    Die Debugger Ausgaben sind wegen meiner Debug.Print Anweisungen natürlich endlos ... hier sind die ersten Zeilen:
    Klingt wie Stringvergleich.
    DATAGRIDVIEWROW { INDEX=3 } - DATAGRIDVIEWROW { INDEX=341 } --> -1: "3" < "341", also ergibt CompareTo -1
    DATAGRIDVIEWROW { INDEX=4 } - DATAGRIDVIEWROW { INDEX=341 } --> 1: "4" > "341", also ergibt CompareTo 1
    usw. usf.

    Das hatte ich in meinem Testprojekt auch kurz, ich musste da für sorgen, dass nicht die Zeile an sich ausgewertet wird, sondern der Inhalt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi.

    Tipp:
    Bei String Vergleich und bei gemischten Sprachen bitte auf die bewährten Methoden/Techniken der CultureInfo eingehen.

    Ich hatte solch ähnliches verhalten bei einem Übersetzungsprogramm, wobei ich keine CultureInfo definiert habe, und es zu unvorhersagbaren Ergebnissen kam.
    Nach dem Festlegen einer CultureInfo für die jeweiligen Sprachen, ging auch die Sortierung vernünftig.

    Versuche doch einmal der DataGridView eine CultureInfo mitzugeben, und bei Teilerfolg dann diese auf die Spalte zu beschränken.

    Anmerkung: Ich nutzte nie eine DataGridView in meinen Programmen, ist mir zu Excellig. Daher sind meine Angaben mit Vorsicht zu genießen. ;)

    c.u Joshi der nie mit dem DGV tanzt. :huh: