So, jetzt endlich mit typisiertem DataSet, wie sortiere und manipuliere ich denn jetzt meine DataTable?

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    So, jetzt endlich mit typisiertem DataSet, wie sortiere und manipuliere ich denn jetzt meine DataTable?

    Hallo,

    ich habs dank eurer Hilfe endlich geschafft ein typisiertes DataSet mit meinen Daten zu versorgen. Ein paar Optimierungen hier oder da sind noch drin.

    Mein Ziel war es ja die DataTable nachträglich sortieren, filtern und Einträge ändern zu können, Hinzufügen oder löschen ist nicht nötig.
    Wichtig, ich möchte die Tabelle sortieren, nicht die Ansicht. Eintrag 1 nach der Sortierung in der Ansicht soll auch Zeile 1 der Tabelle nach der Sortierung sein

    Jetzt also von einem typ.DataSet ausgehend.

    Haudruferzappeltnoch schrieb:

    Wichtig, ich möchte die Tabelle sortieren, nicht die Ansich

    Könntest du das genauer erläutern? Meinst du mit "Tablle" die Daten an sich? Warum möchtest du diese sortieren, wenn sich dies nicht auf die Ansicht auswirken sol?
    Also was ist der Sinn dahinter?
    Ich habe dir schon mal geschrieben, dass man Tabellen nicht sortiert und auch warum nicht.
    Zudem habe ich dir sogar geschrieben, wie man das macht.
    @ErfinderDesRades hat dir im Folgepost des anderen Threads mit gleicher Frage sogar noch deutlicher geschrieben, warum man das besser nicht macht.

    Die Wiederholung der Frage bringt keine neue Antworten, im Gegenteil.
    Bei streng typiserten Datasets / Tabellen ist viel eher davon auszugehen, dass es abhängige Tabellen gibt als bei "on the fly hingerotzte Tabellen, die man nur temporär benötigt.
    @DerSmurf Nein die Ansicht darf sich darauf auswirken, aber ich brauche die Sortierung in den Daten damit ich effektivere Durchsuchungen anstellen kann.

    @Dksksm Nun ihr habt mir immer wieder gesagt ich soll erstmal zum typ. DataSet wechseln, daher ging davon aus wird die Vorgehensweise sich ändern. Da ist nichts abhängig bei mir, das ist eine Tabelle die halt leider per Datenbank eingelesen werden muss. Wenn ich das in ein 2 dimensionales Array schreiben würde wäre es dasselbe Ergebnis für mich. Ich hatte mir nur erhofft eine Tabelle bietet mehr Optionen als ein 2 dimensionales Array.
    Letzten Endes funktioniert das Sortieren im Array ja auch, aber da ihr so auf dem typ. DataSet behaart kommen wir ja nicht darauf ob das schlichtweg in der Tabelle nicht geht.

    So laufe ich jetzt durch zwei Tabellen mit x und y Zeilen um einen Wert zu vergleichen, was x*y Prüfungen sind; mit sortierung reduziert sich das auf x+Aufschlag Prüfungen, was natürlich ein riesen Ersparnis wäre.

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

    Haudruferzappeltnoch schrieb:

    Nein die Ansicht darf sich darauf auswirken, aber ich brauche die Sortierung in den Daten damit ich effektivere Durchsuchungen anstellen kann.

    Ohne zu wissen was du vorhast widerspreche ich dir hier. Ich finde dir (als Anfänger) in meinem Dts alles, ohne mir auch nur Gedanken zu machen, wies sortiert ist.

    Kannste mal ein Beispiel posten?
    ID
    Prüfnummer1
    Prüfnummer2
    KE_Prüfnummer1
    KE_Prüfnummer2
    1
    55122
    55122
    0
    0
    2
    12345
    12222
    0
    0
    3
    14442
    44321
    0
    0
    4
    42450
    12345
    0
    0
    5
    12346
    42450
    0
    0

    Edit Codelogik:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For i
    2. For j
    3. If Zeile(i).Spalte(1) = Zeile(j).Spalte(2) Then
    4. Zeile(i).Spalte(3) = 1
    5. Zeile(j).Spalte(4) = 1
    6. End If
    7. Next
    8. Next

    In diesem Beispiel würde ich z.B. 55122 aus Prüfnummer1 nehmen und in Prüfnummer2 suchen, beim Finden wird KE_Prüfnummer1 auf 1 gesetzt wo die Prüfnummer 1 55122 ist und (Edit: KE_Prüfnummer2 auf 1 gesetzt,) wo Prüfnummer 2 55122 ist.
    So mit allen Werten aus Prüfnummer1 fort. In einer doppelten For Schleife werden so 25 Prüfungen fällig, wenn man nach dem Finden gnädig ist und doppelte Fundstellen ausschließt sinds vielleicht ~19 Prüfungen.

    Mit Sortierung
    ID
    Prüfnummer1
    Prüfnummer2
    KE_Prüfnummer1
    KE_Prüfnummer2
    1
    12345
    12222
    0
    0
    2
    12346
    12345
    0
    0
    3
    14442
    42450
    0
    0
    4
    42450
    44321
    0
    0
    5
    55122
    55122
    0
    0

    So kann ich ihm natürlich mitteilen wenn er einen Wert überschritten hat, kommt da nichts mehr; ich kann die Schleife vorzeitig verlassen. Und habe nur noch 9 Prüfungen

    Das Ergebnis, Sortierung ist hier wieder egal:
    ID
    Prüfnummer1
    Prüfnummer2
    KE_Prüfnummer1
    KE_Prüfnummer2
    1
    55122
    55122
    1
    1
    2
    12345
    12222
    1
    0
    3
    14442
    44321
    0
    0
    4
    42450
    12345
    1
    1
    5
    12346
    42450
    0
    1

    LINQ klingt ziemlich gut, ich hab aber gelesen Änderungen gehen damit nicht.

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

    Haudruferzappeltnoch schrieb:

    In diesem Beispiel würde ich z.B. 55122 aus Prüfnummer1 nehmen und in Prüfnummer2 suchen, beim Finden wird KE_Prüfnummer1 auf 1 gesetzt wo die Prüfnummer 1 55122 ist und wo Prüfnummer 2 55122 ist.
    So mit allen Werten aus Prüfnummer1 fort. In einer doppelten For Schleife werden so 25 Prüfungen fällig, wenn man nach dem Finden gnädig ist und doppelte Fundstellen ausschließt sinds vielleicht ~19 Prüfungen.

    Vermutlich hab ich deine Beschreibung nicht verstanden. Wenn du in die Datensätze KE_Prüfnummer1=1 schreiben willst, wo Prüfnummer1 und Prüfnummer2 übereinstimmen, dann sind das bei mir nur 5 Prüfungen.

    Zeig doch mal ein erwünschtes Gesamtergebnis aus der Verarbeitung deiner ersten Tabelle.
    Kleiner Seiteneinwurf: Sicher, dass es schneller ist erst alles zu sortieren und dann darin zu suchen, als einfach direkt zu suchen? Meine neulich haben hier mal welche nen test gemacht. Weiß aber nicht mehr sicher das Ergebnis. Glaub ohne sortieren war es insgesamt schneller.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @ErfinderDesRades Also ich prüfe nicht ob Prüfnummer1 und Prüfnummer 2 in ihrer Zeile übereinstimmen, sondern ob jeder Prüfnummer1 Eintrag in der Prüfnummer2 Spalte enthalten ist.
    Das sieht man auch an dem Ergebnis, das ich dazu gepackt habe. Da ist in Zeile 2 KE_Prüfnummer1 = 1, obwohl Prüfnummer1 und Prüfnummer2 in dieser Zeile unterschiedlich sind. (Also ich denke das meinst du mit dem Ergebnis meiner ersten Tabelle)

    @mrMo Nun wenn man das händisch sortieren muss dann ist klar, das der Vorteil womöglich entfällt, da kommt es schlichtweg drauf an wie die Ursprungsortierung aussieht, wie lange es dauert. Eine direkte Suche habe ich natürlich schon probiert und ist auch jetzt erstmal verwendbar aber die dauert 12 Minuten. (da krieg ich ja Angst das Visual Studio mir davon läuft)

    Deswegen frage ich ja. Aber wurde immer wieder an typ. DataSets verwiesen. Ein simples "geht nicht" hätte natürlich die Posts gespart, das kann ich ja nicht wissen.
    Eine Sortierung wie sie bei BindingSource vorliegt ist deutlich schneller als was man hier händisch anstellen müsste, das weiß ich. Mit so einer Sortierung und meiner Schleife ist das Zeitersparnis ca. Faktor 1000. Liegt aber vielleicht auch an mir...

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

    Haudruferzappeltnoch schrieb:

    Also ich prüfe ... ob jeder Prüfnummer1 Eintrag in der Prüfnummer2 Spalte enthalten ist.
    Nein, auch nicht.
    Du prüfst, welcher Prüfnummer1 Eintrag irgendwo in der Prüfnummer2-Spalte auch vorkommt. Zumindest das Ergebnis sieht so aus.
    Klassischer InnerJoin - kann man mit Linq elegant und höchst effizient lösen.

    Was aber, wenn derselbe Prüfnummer1 Eintrag in Prüfnummer2 mehrfach auftritt?

    Und wie heisst die Tabelle? - dann könnte ich evtl. auch schonwieder was basteln.