Bestimmte Properties zweier Klasseninstanzen miteinander vergleichen ....

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von wolfi_bayern.

    Bestimmte Properties zweier Klasseninstanzen miteinander vergleichen ....

    Moin!

    ich hoffe, dass meine Überschrift richtig gewäht wurde - das gleich einmal vorweg.

    Ich habe folgende Klasse definiert um Eigenschaften zu hinterlegen.

    VB.NET-Quellcode

    1. Public Class DataOfDatenErhebung 'Definition der Parameter für die Abfrage
    2. Private _connection As Connection
    3. Private _Eblog As EBL.MapEdit.FUNC_Log
    4. Private _fDBConnTools As EBL.MapEdit.FUNC_DB_ConnectionTools
    5. Public Property FID As Long = -1
    6. Public Property FID_MITARBEITER As Long = -1
    7. Public Property FID_WE As Long = -1
    8. Public Property FID_JOURNAL As Long = -1
    9. Public Property FID_ERHEBUNG As Long = -1
    10. Public Property ID_QUELLE As Integer = -1
    11. Public Property ID_ART_KONTROLLE As Integer = -1
    12. Public Property ID_GSE_TRENN As Integer = -1
    13. Public Property ID_NW_DRAIN_VORFLUT As Integer = -1
    14. Public Property ID_VERSICKERUNG As Integer = -1
    15. Public Property ID_VERSICKERUNGS_ART As Integer = -1
    16. ...


    Nun werden zwei Instanzen definiert und den Properties werden Werte zugewiesen.

    VB.NET-Quellcode

    1. Private _Data_Datenerhebung As EBL.MapEdit.DataOfDatenErhebung
    2. Private _Data_Merge As EBL.MapEdit.DataOfDatenErhebung


    Nun möchte ich die Werte dieser beiden Instanzen, komplett bzw. teilweise, miteinander auf Übereinstimmung vergleichen.

    Bei Letzterem würde ich vielleicht eine Art List(of erstellen wollen und dann ... aber wie !?!?

    Geht soetwas und wenn wie?

    Gruß Jan
    Wenn du prüfen willst, ob die Referenz gleich ist, kannst du `==` bzw. `=` verwenden.
    Dann gibt's noch ReferenceEqual: learn.microsoft.com/en-us/dotn…erenceequals?view=net-8.0

    Wenn du die Listen prüfen willst, kannst du learn.microsoft.com/en-us/dotn…equenceequal?view=net-8.0 verwenden.

    Du kannst dann natürlich in dem Objekt die Equals-Methode überladen, um darin deine eigene Gleichheitsprüfungen einzubauen. Auch die Operatoren kannst du überladen: learn.microsoft.com/en-us/dotn…how-to-define-an-operator
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Ja die Klasse DataOfDatenerhebung sollte eine Methode definieren, mit der IEquatable Schnittstelle muss es nicht zwangsläufig sein, vor allem da die Objekte ja auf unterschiedliche Arten verglichen werden sollen.

    Mit Type.GetProperties kriegst auch eine Sammlung der Properties, wenn es viel wird. Dann kannst du in der Klasse über den Zugriffsmodifizierer der jeweiligen Property festlegen ob sie drin sein soll, die Methode nimmt nur Public Properties rein.
    Moin!

    wenn ich das richtig alles verstehe, dann werden die gesamten Objekte miteinander verglichen.

    Mein Ziel sind aber nur bestimmt properties.

    Deshalb kam ich schon auf die Idee eine Liste mit den Namen der Properties zu erstellten und dann diese durchlaufen zu lassen.

    Von den zu vergleichenden Objekten dann die jeweilign Properties auszulesen und dann zu vergleichen.

    Vermutlich ein Traum.

    Gruß Jan
    Wenn du so eine Liste an Objekten hast, was willst du da vergleichen? Vermutlich gibts da einen simplen LINQ für.

    Dein erster Post hört sich danach an, als willst du Instanz A mit Instanz B vergleichen.

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

    jan99 schrieb:

    Mein Ziel sind aber nur bestimmt properties.


    Eben drum:

    C#-Quellcode

    1. class MyFoo(int foobar, bool barbaz, string ignorethis) {
    2. int FooBar { get; set; } = foobar;
    3. bool BazBaz { get; set; } = barbaz;
    4. string IgnoreThis { get; set; } = ignorethis;
    5. public override bool Equals(object fooObj) {
    6. if (fooObj is MyFoo myFoo) {
    7. return myFoo.FooBar == FooBar &&
    8. myFoo.BazBaz == BazBaz;
    9. } else { return false; }
    10. }
    11. }


    Damit gibst du doch genau das an, was du vergleichen willst.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    jan99 schrieb:

    wenn ich das richtig alles verstehe, dann werden die gesamten Objekte miteinander verglichen.
    Mein Ziel sind aber nur bestimmt properties.
    1341 Posts im Forum und noch immer keinen Plan, wie Microsoft-Hilfedokumente aufgerufen werden. :thumbdown:
    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!
    Moin!

    1341 Posts im Forum und noch immer keinen Plan, wie Microsoft-Hilfedokumente aufgerufen werden.


    .... aber alles selber erarbeitet und nie im Studium gehabt oder sonstige Seminare besucht.

    nachdem irgendwie mein Verständnis nicht an Eure Erlärkungen kommt -
    oder ich nur Bretter vor dem Kopf habe - stelle ich hierzu eine
    abschließende Frage.

    Kann man irgendwie von dieser Properties die Eigenschaft über den Name, wie bei einem Item einer Liste oder Collection abfragen.

    Ich stelle mir soetwas vor zu

    VB.NET-Quellcode

    1. Public Property FID_MITARBEITER As Long = -1
    2. Public Property FID_WE As Long = -1
    3. Public Property FID_JOURNAL As Long = -1
    4. Public Property FID_ERHEBUNG As Long = -1
    5. _Data_Datenerhebung("FID_MITARBEITER")


    Dann kann ich den Klammerwert bliebig austauschen.

    Würde mir auch schon weiterhelfen.

    Gruß Jan


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

    Ja, das geht mittels Reflection, aber das willst du nicht.

    Nimm den Code den ich geschrieben habe, schiebe es durch einen Übersetzer für VB und dann hast du eine schlanke, lesbare und performante Lösung.

    Neige nicht dazu, deine Lösungen zu verkomplizieren. Das wollen viele in diesem Forum. Du machst deinen Code dadurch nicht besser.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Moin!

    das habe ich versucht via converter.telerik.com/

    Dabei ist nichts brauchbares herausgekommen!

    Spoiler anzeigen






    Error converting code

    Error message:

    CONVERSION ERROR: Conversion for IncompleteMember not implemented, please report this issue in '(int foobar, bool barbaz, s...' at character 40

    at ICSharpCode.CodeConverter.VB.NodesVisitor.DefaultVisit(SyntaxNode node)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIncompleteMember(IncompleteMemberSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.IncompleteMemberSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)

    at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIncompleteMember(IncompleteMemberSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.IncompleteMemberSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at ICSharpCode.CodeConverter.VB.NodesVisitor.<VisitClassDeclaration>b__23_0(MemberDeclarationSyntax m)

    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)

    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

    at ICSharpCode.CodeConverter.VB.NodesVisitor.VisitClassDeclaration(ClassDeclarationSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)

    at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitClassDeclaration(ClassDeclarationSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at ICSharpCode.CodeConverter.VB.NodesVisitor.<VisitCompilationUnit>b__15_1(MemberDeclarationSyntax m)

    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

    at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)

    at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)

    at Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.List[TNode](IEnumerable`1 nodes)

    at ICSharpCode.CodeConverter.VB.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)

    at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)

    at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitCompilationUnit(CompilationUnitSyntax node)

    at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)

    at ICSharpCode.CodeConverter.VB.CSharpConverter.ConvertCompilationTree(CSharpCompilation compilation, CSharpSyntaxTree tree)

    at ICSharpCode.CodeConverter.VB.CSToVBConversion.SingleFirstPass(Compilation sourceCompilation, SyntaxTree tree)

    at ICSharpCode.CodeConverter.Shared.ProjectConversion.SingleFirstPass(SyntaxTree tree, String treeFilePath)

    at ICSharpCode.CodeConverter.Shared.ProjectConversion.FirstPass()


    Gruß Jan
    Und den Code versuchen zu verstehen?
    Keine Ahnung ob das so passt, aber kannst es ja mal versuchen:

    VB.NET-Quellcode

    1. Friend Class MyFoo
    2. Private Property FooBar As Integer = foobar
    3. Private Property BazBaz As Boolean = barbaz
    4. Private Property IgnoreThis As String = ignorethis
    5. Public Overrides Function Equals(fooObj As Object) As Boolean
    6. If TypeOf fooObj Is MyFoo Then
    7. Return myFoo.FooBar = FooBar AndAlso myFoo.BazBaz = BazBaz
    8. Else
    9. Return False
    10. End If
    11. End Function
    12. End Class

    jan99 schrieb:

    Moin!

    das habe ich versucht via converter.telerik.com/

    Dabei ist nichts brauchbares herausgekommen!


    Der Telerik Converter ist auch veralteter Schrott. Gibt viel bessere im Netz, wenn man danach sucht. Eines gibt es z.B. bei GitHub, was auch mit den modernen Sprachversionen klarkommt.

    Ich habe mir die Primary Constructors bei C# angewöhnt. Damit kommen veraltete Converter nicht klar.


    @slice hat da aber schon den richtigen Riecher. Mein VB ist maximal rostig, aber das scheint so gut auszusehen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Habe keine Probleme mit telerik.
    In diesem Fall scheint er Probleme damit zu haben, dass deine "Klasse" Methodenargumente aufweist, was ich so auch nicht kenne aus VB

    Reflection kann durchaus helfen, ich schätze er hat einfach ganz viele Properties und die will er nicht alle hinschreiben.
    @jan99 Wenn du wirklich mit dem Namen der Property als String arbeiten willst macht es keinen Sinn mehr.
    Aber mit den Indexen womöglich in einer Schleife und wie gesagt machst du die Property Friend dann taucht sie in GetProperties nichtmehr auf

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim t As New Test With {.A = "aba", .B = "abb"}
    3. Dim val1 = GetType(Test).GetProperties()(0).GetValue(t) 'gibt aba
    4. Dim val2 = GetType(Test).GetProperties()(1).GetValue(t) 'gibt abb
    5. End Sub
    6. Class Test
    7. Public Property A As String
    8. Public Property B As String
    9. End Class


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

    Haudruferzappeltnoch schrieb:

    Habe keine Probleme mit telerik.

    Wenn du meinen Beitrag gelesen hättest, wüsstest du, dass es nicht mit modernem C# klarkommt.
    Nur weil manche Leute damit keine Probleme haben, weil sie es nicht für moderne Features z.B. nutzen, heißt es nicht dass das Tool der Zeit entspricht.

    Haudruferzappeltnoch schrieb:

    dass deine "Klasse"

    Und auch hier, hättest du meinen Beitrag gelesen, wüsstest du dass es hier keine "Klasse" ist, sondern eine Klasse mit Primary Constructor.
    learn.microsoft.com/en-us/dotn…ials/primary-constructors

    Die Syntax ähnelt dem der learn.microsoft.com/en-us/dotn…ence/builtin-types/record (bzw. sie kommt genau daher).

    Haudruferzappeltnoch schrieb:

    aus VB

    Weil VB's Syntax einfach wegen seiner Beschaffenheit wahrscheinlich nicht bekommen wird. Sie ist schon zu verbos, um einige Sachen damit zu machen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Moin!
    Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich habe mir jetzt das einmal angesehen und könnte für mich das passende sein.

    Nur eine Nachfrage noch ....

    VB.NET-Quellcode

    1. Dim val1 = GetType(DataOfDatenErhebung).GetProperties()(0).GetValue(_Data_Datenerhebung)
    2. Dim val2 = GetType(DataOfDatenErhebung).GetProperties()(1).GetValue(_Data_WE)


    Der Index in der zweiten Klammer bei GetProperties bezieht sich immer aufdieselbe Property in der Variablen _Data_Datenerhebung wie auch _Data_WE??


    Gruß Jan

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

    jan99 schrieb:

    Der Index in der zweiten Klammer bei GetProperties bezieht sich immer aufdieselbe Property in der Variablen _Data_Datenerhebung wie auch _Data_WE??
    Nö.
    val1 fragt die Property mit dem Index 0 ab.
    val2 fragt die Property mit dem Index 1 ab.
    Machst Du zunächst

    VB.NET-Quellcode

    1. Dim props = GetType(DataOfDatenErhebung).GetProperties()
    2. Dim val1 = props(0).GetValue(_Data_Datenerhebung)
    3. Dim val2 = props(1).GetValue(_Data_WE)
    und setzt einen Haltepunkt drauf, kannst Du sehen, wo das hingreift.
    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!
    Uff, also auch wenn es eher Offtopic ist, aber wie @siycah schon erwähnt hat: Mach es dir nicht unnötig komplizierter als es sein muss!
    Klar kann man das Problem mit Reflection lösen, aber dafür sollte man verstehen was da passiert, was es bedeutet und wie man es benutzt debuggt.

    Meine Empfehlung: Bleib bei der Lösung mit der Implementierung von Equals und gut ist.

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

    @slice Ich hab's aufgegeben. Hier stößt man nur auf taube Ohren. :thumbdown:
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @siycah Hätte ich deinen Beitrag nicht gelesen, hätt ich nix dazu schreiben können... Was soll telerik deiner Meinung nach tun wenn ein "modernes" c# Feature nach VB übersetzt werden soll, dass es in VB nicht gibt?
    Ich finde eine Fehlermeldung da ehrlich gesagt die genau richtige Lösung. Dementsprechend korrigiere ich das gern und sage nicht "telerik macht bei mir keine Probleme", sondern "telerik macht keine Probleme"

    Denke auch nicht dass das was mit der Verbosität zu tun hat, sondern eher weil VB so wenige nutzen, das weniger Firlefanz getrieben wird.

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