List(of) mit erweiterten Einträgen vergleichen

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

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

    List(of) mit erweiterten Einträgen vergleichen

    Guten Morgen. Ich erstelle mir eine List(of FilJob). Das ist Quasi eine List mit Spalten.

    VB.NET-Quellcode

    1. Public Shared FileList As New List(Of FileJob)
    2. Public Class FileJob
    3. Public Name As String
    4. Public Größe As String
    5. End Class
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. FileList.Add(New FileJob With {.Name = "Max MusterMann", .Größe = "100000"})
    8. End Sub



    Eine Einfache List(of String) kann ich ja einfach mit

    VB.NET-Quellcode

    1. ​ ListEnd.AddRange(lista1.Except(Listb1))


    vergleichen.

    Ich bekomme es aber nicht hin das ich aus der List(Of FileJob) die (Quasi) Spalte Name vergleichen kann.

    Hoffe es kann mir wer helfen.

    Grüße TM
    Das ginge zuallererst über eine Extension namens ExceptBy. Die kannst Du Dir mit etwas Erfahrung selber basteln oder Dir mit MoreLINQ holen.
    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.
    @Toolmaster Implementiere für FileJob das IComparable(Of FileJob)-Interface nach Deinen Bedürfnissen, da sollte der Rest automatisch funktionieren.
    docs.microsoft.com/de-de/dotne…mparable?view=netcore-3.1
    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!
    Hallo der Tipp von Rod hat anfangs sehr gut geklungen, doch übersteigt er etwas meine Kenntnisse. Bis jetzt habe ich :

    VB.NET-Quellcode

    1. ​Namespace FileComparer
    2. Public Class CompareofFiles
    3. Public Class FileJob
    4. Public Property Name As String
    5. Public Property Größe As String
    6. End Class
    7. Public Class FileJobComparer
    8. Implements IComparable(Of FileJob)
    9. Public Function CompareTo(other As FileJob) As Integer Implements IComparable(Of FileJob).CompareTo
    10. Throw New NotImplementedException()
    11. End Function
    12. End Class
    13. End Class
    14. End Namespace


    Doch jetzt habe ich keinen blassen Schimmer wie es weitergehen soll.

    Hast du da noch eine kleine Anregung der Hilfe parat?

    Grüße TM
    @Toolmaster Das geht wesentlich einfacher:

    VB.NET-Quellcode

    1. Public Class FileJob
    2. Implements IComparable(Of FileJob)
    3. Public Property Name As String
    4. Public Property Größe As String
    5. Public Function CompareTo(other As FileJob) As Integer Implements IComparable(Of FileJob).CompareTo
    6. Return Me.Name.CompareTo(other.Name) ' Das hier musst Du nach Deinen Bedürfnissen coden
    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!
    Nun, wenn ich sehe, wie weit Du mit der Schnittstellenimplementierung gekommen bist (nämlich: nicht sehr weit), hier eine Möglichkeit für ExceptBy:
    1. Datei:

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module Extensions
    3. <Extension> Public Function ExceptBy(Of T)(List As IEnumerable(Of T), Predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
    4. Return List.Where(Function(x) Not Predicate(x))
    5. End Function
    6. End Module


    Testdatei

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Foos As New List(Of Foo) From {New Foo With {.Name = "A"}, New Foo With {.Name = "B"}, New Foo With {.Name = "C"}}
    4. Dim SomeFoos = Foos.ExceptBy(Function(x) x.Name = "B")
    5. End Sub
    6. End Class
    7. Public Class Foo
    8. Property Name As String
    9. Property Bar As Object
    10. End Class


    Da kommt dann raus: Das Foo mit A und das Foo mit C. Das mit B wurde ausgesiebt.
    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.
    Ich danke euch beiden vielmals für eure Hilfe. Habe aber noch 2 Fragen zu Rods Code.

    1. Quelllaufwerk.Quelle.FileList ist meine erste List(Of). Ziellaufwerk.Ziel.FileList ist die Zweite List. Nun habe ich folgenden Code hinzugefügt.

    VB.NET-Quellcode

    1. ​Public Function CompareTo(other As FileJob) As Integer Implements IComparable(Of FileJob).CompareTo
    2. Return Quelllaufwerk.Quelle.FileList(other.Name).CompareTo(Ziellaufwerk.Ziel.FileList(other.Name))
    3. End Function


    ist das für den vergleich von den 2 listen richtig?

    2. Diese etwas Dumme Frage ob der obengenannte Code richtig ist resultiert aus meiner zweiten Frage. Ich habe es noch nicht geschafft den Vergleich aufzurufen.
    Kannst du mir hier nochmal weiterhelfen. :/
    Ich hätte auch noch einen Vorschlag

    VB.NET-Quellcode

    1. Dim DeineFileJobList = New FileJob From { ..........}
    2. Dim DeineNamensList = {"name1", "name2", "name3", .....}
    3. 'Eventuell brauchst auch noch das
    4. 'Dim DeineNamensList = DeineFileJobList2.Select(Function(fj) fj.Name).ToList
    5. Dim result = DeineFileJobList.FilterName(DeineNamensList)

    VB.NET-Quellcode

    1. <Extension>
    2. Public Function FilterName(filejobs As List(Of FileJob), names As List(Of String)) As List(Of FileJob)
    3. Dim result = New List(Of FileJob)
    4. Dim query = filejobs.GroupBy(Function(fj) fj.Name)
    5. names.ForEach(Sub(s) result.AddRange(query.
    6. Where(Function(ig) ig.Key = s)(0).ToList))
    7. Return result
    8. End Function

    Freundiche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    exc Du hast mich auf eine Idee gebracht, die sogar funktioniert. :)

    Was spricht eigentlich gegen diesen Code.

    VB.NET-Quellcode

    1. ​Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    2. Dim ListEnd As New List(Of String)
    3. Dim Quelliste = Quelllaufwerk.Quelle.FileList.Select(Function(fj) fj.Name).ToList
    4. Dim ZielListe = Ziellaufwerk.Ziel.FileList.Select(Function(fj) fj.Name).ToList
    5. ListEnd.AddRange(Quelliste.Except(ZielListe))
    6. ListBox1.Items.AddRange(ListEnd.ToArray)
    7. End Sub


    Vergleicht 2 Listen und gibt mir die unterschiede aus.
    Ich hoffe diese Frage kannst du am Besten selber beantworten.

    Ich war mir bei deiner Frage oben nicht ganz sicher, was du wirklich willst. Die Differenzmenge beider Liste hat ja in dem Sinne nichts mit dem Vergleich der Namen zu tun. Ein FileJob kann ja den gleichen Namen haben, aber eine andere Größe.

    Auch die ListEnd verwirrt mich. Hat es in dieser Liste schon irgendwelche FileJob drine? Warum addes die dort rein? "Except" gibt ja eine eigene List(of FileJob) bzw. im neuen Code List(of string) aus. Einfach ein ToList anhängen. Quelliste.Except(ZielListe) könnte man auch direkt der ListBox zufügen, ausser ListEnd wird noch für weiteres gebraucht.

    Ich denke, wenn es jetzt für dich stimmt dann ist das schon gut.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Toolmaster schrieb:

    Was spricht eigentlich gegen diesen Code.
    Dass er nur funktioniert, solange man zwei Listen hat und sich diese zwei Listen aus der selben Ursprungsliste speisen. Bei "meiner" ExceptBy-Variante geht das einfacher. Aber wenn es für Deine Situation reicht, alles gut.
    Was mir allerdings etwas sauer aufstößt, ist die Tatsache, dass sich die Anforderungen seit Post#1 ein großes Stück geändert haben. Zuerst wolltest Du,

    Toolmaster schrieb:

    das ich aus der List(Of FileJob) die (Quasi) Spalte Name vergleichen kann.
    Nun kommt aber in Post#9 mit Deiner Lösung eine ganz andere Aufgabenstellung ans Tageslicht. So wird es schwierig, eine Lösung zu finden.
    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.
    Das mag sein, aber geschrieben hast Du in Post#1, dass Du die Namensspalte vergleichen willst. Und das haben wir versucht, umzusetzen.
    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.