List(Of String) mit Eigenschaft einer ObservableCollection(Of Class) vergleichen

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    List(Of String) mit Eigenschaft einer ObservableCollection(Of Class) vergleichen

    Hallo miteinander :)

    Ich bin noch recht neu im Filtern von Daten und habe folgendes Problem:

    Ich habe eine AktuelleAudioDateien As List(Of String) mit Dateinamen drinne.

    Dann hab ich eine GesammelteAudioDateienObservableCollection Of(MeineKlasse) mit der Eigenschaft Dateiname As String

    Jetzt möchte ich eine weitere Liste erhalten, die alle Dateinamen bekommen soll, die zwar in AktuelleAudioDateien drin sind, aber nicht in GesammelteAudioDateien...

    Wie geh ich da am einfachsten und v.a. performantesten vor? Die GesammelteAudioDateien kann schon mal meherere tausend Einträge haben....
    @kafffee In meiner Snippet-Sammlung fand ich dies bei LINQ:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' geht nur bei Value-Types, nicht aber bei Reference-Types !!!
    3. ' => ggf. Equals() überschreiben
    4. Dim l1 As New List(Of String) From {"A", "B", "D"}
    5. Dim l2 As New List(Of String) From {"A", "B", "C"}
    6. ' Alles in l1, was NICHT in l2 ist -> D
    7. Dim a = l1.Except(l2)
    8. ' Alles in l2, was NICHT in l1 ist -> C
    9. Dim b = l2.Except(l1)
    10. ' Alles was in BEIDEN Listen ist -> A,B
    11. Dim c = l1.Intersect(l2)
    12. MessageBox.Show(String.Join(", ", a) & Environment.NewLine & String.Join(", ", b) & Environment.NewLine & String.Join(", ", c))
    13. End Sub
    Sehen, ausprobieren, ein wenig rumspielen und anwenden.
    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!
    Anstatt ObservableCollections zun binden bau eine ICollectionView ein, diese bindest du dann. Die ICollectionView kannst du leicht filtern. Die ICollectionView hat dann alle oder nur die gefilterten Items aus der gewollten ObserveableCollection.
    Hier habe ich dazu eien Code gepostet.
    Per Code nur auf gefilterte Daten der ICollectionView zugreifen


    Edit:
    So hast du eine Funktion in der du leicht festlegen kannst, das will ich und das nicht.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    @DTF
    Ja ggf. mach ich das mit den CollectionView... Hab das an anderer Stelle auch schon gemacht sogar.

    @RodFromGermany
    Ja das mit dem .Except hatte ich grade schon in den Fingern bei meiner Recherche. Problem ist dass ich nicht zwei List(Of String)s habe, sondern eine List(Of String) und eine List(Of MeineKlasse), die eine Eigenschaft Dateiname hat...

    Ich hatte gehofft da gibts so nen superkurzen LINQ-Befehl oder sowas, gibts bestimmt auch...

    kafffee schrieb:

    Hab das an anderer Stelle auch schon gemacht sogar.


    Dann ist es doch ein leichtes.
    In der Funktion zum filtern welche für jedes Item durchlaufen wird, Testen ob AktuelleAudioDateien.Contains(Item) und ob Not GesammelteAudioDateien.contains(Item) und nur dann true zurückgeben sonst false.
    (Bzw. Item.Dateiname)
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    kafffee schrieb:

    eine List(Of String) und eine List(Of MeineKlasse), die eine Eigenschaft Dateiname hat

    VB.NET-Quellcode

    1. Dim WasNichtInDeinerKlasseSondernNurInDeinerStringListeZuFindenIst = StringListe.Except(DeineKlassenliste.Select(Function(x) x.Dateiname))

    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.
    Nuja, bei Mikrosaft eben (explizit auf Englisch, da bei Deutsch gruselige AutoÜbersetzungen dabei sind, inkl. Schlüsselwortübersetzung). Ich verwend am häufigsten: First, Single, Select, Where, Any, OrderBy, Cast. Aber auch die anderen sollte man sich mal reinziehen. Kann man immer wieder und öfter/häufiger gebrauchen.
    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.
    Edit: Hat sich erledigt. Aus irgendeinem Grund hat mir die IDE gesagt man soll das als Delegate machen. Naja, hab ich wenigstens wieder bisschen damit geübt. Die Ergbnisliste muss nur vom Typ IEnumerable(Of String) sein...

    @VaporiZed


    Irgendwie will das nicht ganz. Ich habe jetzt das:

    VB.NET-Quellcode

    1. Delegate Function ErmittleNeueDateienDelegate(DateiListe As List(Of String)) As List(Of String)
    2. Public Function ErmittleNeueDateien(DateiListe As List(Of String)) As ErmittleNeueDateienDelegate
    3. Return DateiListe.Except(MainModule.InhaltGesamt.Select(Function(x) x.Dateiname))
    4. End Function
    5. Public Sub Zufuegen()
    6. Dim NeueAudioDateien As New List(Of String)
    7. Dim HoleNeueDateien As ErmittleNeueDateienDelegate = ErmittleNeueDateien(AktuelleAudioDateien)
    8. NeueAudioDateien = HoleNeueDateien(AktuelleAudioDateien)
    9. End Sub


    Da kommt in Zeile 4 der Fehler:

    Option Strict On lässt keine impliziten Konvertierungen von IEnumerable(Of String) ErmittleNeueDateienDelegate zu...

    Selbst wenn ich das dann explizit konvertiere, knallt es halt zur Laufzeit, auch weil es nicht konvertiert werden kann...

    Ich bin mal wieder überfragt.

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

    HäWieWas muss ein Delegate sein? An welcher Stelle? Klar, wenn Du die Function mit Rückgabetyp eines Delegates selber setzt, dann musst Du Dich auch damit rumschlagen. Aber ich hab damit nix am Hut, daher kann ich Dir da nicht weiterhelfen. Aber wenn Du nur mit den o.g. LINQ-Extensions arbeitest, kommt auch nur ein IEnumerable(Of String) raus. Oder eine List(Of String) oder ein String-Array. Wie Du es brauchst.
    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 schrieb:

    HäWieWas muss ein Delegate sein?


    Ja das hab ich auch gedacht. An irgendeiner Stelle hat mir die IDE irgendwas mit Delegates gesagt, ich hab dann auf die Fehlermeldung geklickt und bin auf eine MS Seite über Delegates gelandet. Ich muss da irgendwas falsch eingetippt haben. Naja, egal jetzt läuft es. Danke nochmal für den Link, hab ihn an anderer Stelle auch schon gebrauchen können, hab die OrderBy-Funktion auch schon genutzt...
    An kafffee:

    normalerweise macht es Sinn, sich an ein Thema, das einem völlig fremd ist, langsam anzunähern, also z.B. mit einen deutlich einfacheren Delegaten für z.B. ein Unterprogramm ohne Parameterübergabe und Rückgabewert beginnen, damit herumspielen, um ihn in dieser einfachen Form dann wirklich begreifen zu können. Danach fügt man sich eine Kleinigkeit hinzu und spielt wieder damit, bis man es wieder begriffen hat, usw. bis man dort angekommen ist, wo man gerne sein würde. Wie ich öfter sage - mit einem Brötchen ohne alles anfangen, also nix gleich mit Schinken, Tomaten und Mayo mit Ketchup dazwischen. Das gleiche Prinzip gilt eigentlich auch für den Fragezeichen-Modifizierer ? - das man z.B. anhand einer boolschen Variable (False/True/xxx) gut kennenlernen könnte.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

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

    kafffee schrieb:

    Edit: Hat sich erledigt. Aus irgendeinem Grund hat mir die IDE gesagt man soll das als Delegate machen.
    Dassis Grütze.
    Alsso der Code aus post#9 ist für nix zu gebrauchen.
    Linq geht anders, und speziell für Filtern ist die .'Where - Extension zuständig.

    Oder mach mit CollectionView, der du einen Filter gibst - das ist der in Wpf vorgesehene Weg.
    Hat auch den Vorteil, dass nicht ständig neue Daten-Listen entstehen.
    Meine Wenigkeit arbeitet grundsätzlich mit ObservableCollections im ViewModel, auf die eine ListCollectionView aufsitzt - an letztere wird gebunden.
    Die Daten sind und bleiben dann in der OC, und Filtern, Sortieren macht die LCV, ohne den eiglichen DatenContainer zu verändern.