2017-10-13 4 views
2

J'ai une classe Pharmacy qui contient beaucoup de propriétés, et une Pharmacy est déclarée comme unique en ayant la propriété ID comme clé.Vérifier si 2 objets contiennent les mêmes données dans les champs

J'ai le code en place qui récupère toutes les lignes d'une table de MySQL à Pharmacy objets avec leurs propriétés.

Je veux comparer deux objets List<Pharmacy> pour les entrées en eux et vérifier si la même ID existe dans les deux tables, si elle n'existe pas, ajoutez-le à une nouvelle List<Pharmacy. Si le ID existe dans les deux mais les données dans les objets diffère, puis enregistrer cet objet à un nouveau List<Pharmacy.

Voici à quoi ressemble la classe.

public class Pharmacy 
{ 
    [Key] 
    public string Tunniste { get; set; } 
    public string Lyhenne { get; set; } 
    public string PitkaNimi { get; set; } 
    public string YlempiYksikko { get; set; } 
    public string Hierarkiataso { get; set; } 
    public string VoimassaoloAlkaa { get; set; } 
    public string VoimassaoloPaattyy { get; set; } 
    ... 
} 

C'est en finlandais mais j'espère que vous pouvez vivre avec ça. Voici comment j'ai essayé de vérifier s'ils sont identiques. Mais quand j'exécute cela, aucun des objets ne s'identifie comme identique, même s'ils sont identiques dans les données. Comment puis-je contourner cela?

+5

Vous devez remplacer 'Equals' pour comparer la propriété ID, sinon seules les références sont comparées –

+1

Sérialiser les deux objets et comparer les chaînes résultantes, pourrait être une option? – bartbje

Répondre

4

L'implémentation standard de Equals vérifie uniquement l'égalité de référence. What is the default behavior of Equals Method?

Vous pouvez remplacer le comportement Equals. Guidelines for Overriding Equals() and Operator == (C# Programming Guide).

public class Pharmacy { 
    // fields ... 

    public override bool Equals(object obj) { 
     // If parameter is null return false. 
     if (obj == null) { 
      return false; 
     } 

     // If parameter cannot be cast to Pharmacy return false. 
     Pharmacy p = obj as Pharmacy; 
     if ((System.Object)p == null) { 
      return false; 
     } 

     // Return true if the fields match: 
     return p.Lyhenne == this.Lyhenne && 
       p.PitkaNimi == this.PitkaNimi 
       // && etc... 
     ; 
    } 

    public override int GetHashCode() { 
     return Lyhenne.GetHashCode()^PitkaNimi.GetHashCode() /*^etc ... */; 
    } 
} 

Ou vous implémentez une coutume IEqualityComparerIEqualityComparer Interface. Cela peut être préférable si votre ORM Mapper repose sur les équivalents par défaut (comme Entity Framework).