2010-08-19 4 views
-3

public class SecurityMaster: EntityObject { public string BondIdentifier {get; ensemble; } chaîne publique Description {get; ensemble; } public EntityCollection SecurityMasterSchedules {get; ensemble} } public class SecurityMasterSchedules: EntityObject { public string BondIdentifier {get; ensemble; } taux décimal public {get; ensemble; } public datetime startdate {get; ensemble; } public datetime endate {get; ensemble; } }C# comparaison d'objets complexes

Comment comparer les objets List list1 et List list2? IEnumerable sauf la méthode ne fonctionne pas avec des objets complexes.

List<SecurityMaster> list1 = new List<SecurityMaster>(); 
    List<SecurityMaster> list2 = new List<SecurityMaster>(); 
+2

Dans le code que vous avez fourni, je ne vois pas list1, ou list2, ou la méthode Except .... veuillez clarifier. – abelenky

Répondre

1

Je ne suis pas sûr de ce que votre code doit faire avec quoi que ce soit, mais voici comment utiliser Except:

var list1 = new int[] { 1, 2, 3 }; 
var list2 = new int[] { 1 }; 

var output = list1.Except(list2).First(); 

Console.WriteLine(output); // prints "2" 
2

Je devine que vous avez deux IEnumerable<EntityObject> séquences et que vous voulez savoir comment utiliser Except d'une manière qui traite deux EntityObjects comme identiques selon des critères spécifiques. Je vais encore supposer que ces critères comprennent une règle simple (juste pour me faciliter la vie en fournissant cette réponse): deux éléments ayant la même propriété BondIdentifier seront considérés comme identiques.

Eh bien, alors, utilisez la surcharge pour Except qui accepte un IEqualityComparer<T>:

class EntityObjectComparer : IEqualityComparer<EntityObject> 
{ 
    public bool Equals(EntityObject x, EntityObject y) 
    { 
     string xId = GetBondIdentifier(x); 
     string yId = GetBondIdentifier(y); 

     return x.Equals(y); 
    } 

    private string GetBondIdentifier(EntityObject obj) 
    { 
     var sm = obj as SecurityMaster; 
     if (sm != null) 
     { 
      return sm.BondIdentifier; 
     } 

     var sms = obj as SecurityMasterSchedules; 
     if (sms != null) 
     { 
      return sms.BondIdentifier; 
     } 

     return string.Empty; 
    } 
} 

List<EntityObject> list1 = GetList1(); 
List<EntityObject> list2 = GetList2(); 

var itemsInList1NotInList2 = list1.Except(list2, new EntityObjectComparer()); 

Même si je pense que les critères était mauvais, vous pouvez toujours utiliser cette réponse comme une base à partir de laquelle pour formuler votre posséder.

Si mon estimation initiale était également fausse, alors cette réponse est clairement inutile pour vous.