Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Komplexe Objekte Vergleichen
Biggi12
myCSharp.de - Member



Dabei seit:
Beiträge: 4
Herkunft: Deutschland

Themenstarter:

Komplexe Objekte Vergleichen

beantworten | zitieren | melden

Hallo,

ich habe 2 Listen mit Objekten der Klasse Contact (MS - Graph).

Wie kann ich die Objekte der Liste vergleichen ohne die Klasse zu ändern ?

Folgende Datentypen werden Verwendet:

- IEnumerable<string> (Telefon)
- string (Name etc)
- IEnumerable<EmailAddress>


Was ich genau benötige:

Ich bekomme zum beispiel alle 24 Stunden eine Aktualisiert Liste (Liste2).
Die Liste2 muss ich Vergleichen mit der Liste vom Vortag (Liste1).

Wenn ein Wert sich geändert hat, beispiel die Telefonnummer, sollte ich durch den Objekt Vergleich so etwas abfangen können und auf die Veränderung Reagieren können.

Jemand einen guten Vorschlag ? Steh hier etwas auf den Schlauch....:D

Es wird Verwendet:

- C#
- .Net 4.7.2
- Consolen-App
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16204

beantworten | zitieren | melden

Das kommt drauf an, was Du machen willst.

Willst Du auf eine einzelne Sache reagieren: ausprogrammieren.
Willst Du nur wissen ob sie gleich sind oder nicht: gibt verschiedene Möglichkeiten, zB IComparer

Aber das Vergelichen von Objekten in .NET ist eher ein Alltagsthema.
Da findest tausende von Möglichkeiten via Google. Einfach mal selbst bisschen suchen:
Google-Suche nach c# compare two objects
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Biggi12
myCSharp.de - Member



Dabei seit:
Beiträge: 4
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

IComparer würde hier nicht funktionieren, da ich die Klasse nicht Verändern kann.

mit Equals funktioniert es auch nicht.



 
using System.IO;
using System.Xml.Serialization;

static class ObjectHelpers
{
    public static string SerializeObject<T>(this T toSerialize)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());

        using (StringWriter textWriter = new StringWriter())
        {
            xmlSerializer.Serialize(textWriter, toSerialize);
            return textWriter.ToString();
        }
    }

    public static bool EqualTo(this object obj, object toCompare)
    {
        if (obj.SerializeObject() == toCompare.SerializeObject())
            return true;
        else
            return false;
    }

    public static bool IsBlank<T>(this T obj) where T: new()
    {
        T blank = new T();
        T newObj = ((T)obj);

        if (newObj.SerializeObject() == blank.SerializeObject())
            return true;
        else
            return false;
    }

}


Was ein gutes beispiel ist zum Vergleichen von Objekten ist (was ich auch mal Verwendet habe, großartig Funktioniert):

Link:
https://stackoverflow.com/a/53624723/11926104


Das funktioniert bei mir leider auch nicht da, wie oben erwähnt, die Klasse aus MS Graph kommt.

Fehler:
Fehler
System.InvalidOperationException: 'Fehler beim Reflektieren des Typs 'Microsoft.Graph.Contact'.'
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16204

beantworten | zitieren | melden

Dass ein Objekt nicht serialisierbar ist, ist nichts ungewöhnliches.
Dann kannst eben nicht den Serialize-Weg gehen sondern musst entweder vorher in ein eigenes Objekt mappen oder manuell vergleichen.
Siehste auch genug Beispiele bei genanntem Google Link.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 639

beantworten | zitieren | melden

Hallo Biggi12

Wenn deine Klassen generiert worden sind, kann es sein, dass sie das Keyword partial vor dem class haben. Dann kannst du die generierte Klasse mit eigenem Code erweitern.

Ansonsten gäbe es da auch noch den https://www.nuget.org/packages/equalidator/.

Gruß, Alf
private Nachricht | Beiträge des Benutzers