Laden...

Komplexe Objekte Vergleichen

Erstellt von Biggi12 vor 3 Jahren Letzter Beitrag vor 3 Jahren 878 Views
B
Biggi12 Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren
Komplexe Objekte Vergleichen

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
16.806 Beiträge seit 2008
vor 3 Jahren

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

B
Biggi12 Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren

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:> Fehlermeldung:

System.InvalidOperationException: 'Fehler beim Reflektieren des Typs 'Microsoft.Graph.Contact'.'

16.806 Beiträge seit 2008
vor 3 Jahren

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.

A
764 Beiträge seit 2007
vor 3 Jahren

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