2010-08-19 165 views
-3

public class SecurityMaster:EntityObject { public string BondIdentifier {get;组; } public string描述{get;组; } public EntityCollection SecurityMasterSchedules {get; set} } public class SecurityMasterSchedules:EntityObject { public string BondIdentifier {get;组; } public decimal rate {get;组; } public datetime startdate {get;组; } public datetime endate {get;组; } }c#复杂对象比较

如何比较对象List list1和List list2? IEnumerable除了方法不适用于复杂的对象。

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

在您提供的代码中,我没有看到list1或list2或Except方法....请说明。 – abelenky 2010-08-19 22:30:08

回答

1

我不知道你的代码有什么关系,但这里是你如何使用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

我猜你有两个IEnumerable<EntityObject>序列和你想知道如何以在特定标准下将两个EntityObjects视为相同的方式使用Except。我要进一步猜测,这些标准包含一条简单的规则(只是为了让自己更容易提供这个答案):具有相同BondIdentifier属性的两个项目将被视为相同。

那么,使用重载Except接受一个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()); 

即使我的猜测,该标准是错误的,你仍然可以使用这个答案从制定依据您的拥有。

如果我的初步猜测也是错误的,那么显然这个答案对你来说毫无用处。