c#复杂对象比较 public类SecurityMaster:EntityObject { 公共字符串绑定标识符{get;set;} 公共字符串说明{get;set;} 公共EntityCollection SecurityMasterSchedules{get;set} } 公共类SecurityMasterSchedules:EntityObject { 公共字符串绑定标识符{get;set;} 公共十进制率{get;set;} 公共日期时间起始日期{get;set;} 公共日期时间结束日期{get;set;} }

c#复杂对象比较 public类SecurityMaster:EntityObject { 公共字符串绑定标识符{get;set;} 公共字符串说明{get;set;} 公共EntityCollection SecurityMasterSchedules{get;set} } 公共类SecurityMasterSchedules:EntityObject { 公共字符串绑定标识符{get;set;} 公共十进制率{get;set;} 公共日期时间起始日期{get;set;} 公共日期时间结束日期{get;set;} },c#,ienumerable,except,C#,Ienumerable,Except,如何比较对象列表列表1和列表列表2?IEnumerable Exception方法不适用于复杂对象 public class SecurityMaster : EntityObject { public string BondIdentifier { get; set; } public string Description { get; set; } public EntityCollection<SecurityMasterS

如何比较对象列表列表1和列表列表2?IEnumerable Exception方法不适用于复杂对象

public class SecurityMaster : EntityObject
     {
        public string BondIdentifier { get; set; }
        public string Description { get; set; }
         public EntityCollection<SecurityMasterSchedules> SecurityMasterSchedules { get; set}
      }
     public class SecurityMasterSchedules :EntityObject
     {
           public string BondIdentifier { get; set; }
           public decimal rate { get; set; }
           public datetime startdate { get; set; }
           public datetime endate { get; set; }
     }
List list1=新列表();
List list2=新列表();

我不确定您的代码与任何东西有什么关系,但以下是您的使用方法:


我猜您有两个
IEnumerable
序列,并且您想知道如何使用
除了
,在特定条件下将两个
EntityObjects
视为相同。我将进一步猜测,这些标准包括一个简单的规则(只是为了让我在提供这个答案时更轻松):具有相同
BondIdentifier
属性的两个项目将被视为相同

那么,除了接受
IEqualityComparer
的之外,使用
的重载:

类EntityObjectComparer:IEqualityComparer
{
公共布尔等于(EntityObject x,EntityObject y)
{
字符串xId=GetBondIdentifier(x);
字符串yId=GetBondIdentifier(y);
返回x等于(y);
}
私有字符串GetBondIdentifier(EntityObject obj)
{
var sm=作为证券主管的obj;
如果(sm!=null)
{
返回sm.BondIdentifier;
}
var sms=作为证券主计划的obj;
如果(sms!=null)
{
返回sms.BondIdentifier;
}
返回字符串。空;
}
}
List list1=GetList1();
List list2=GetList2();
var itemsInList1NotInList2=list1.Exception(list2,new EntityObjectComparer());
即使我对标准的猜测是错误的,你仍然可以根据这个答案来制定你自己的标准


如果我最初的猜测也是错误的,那么很明显,这个答案对您毫无用处。

在您提供的代码中,我没有看到列表1、列表2或Except方法。。。。请澄清。
   List<SecurityMaster> list1 = new List<SecurityMaster>();
   List<SecurityMaster> list2 = new List<SecurityMaster>();
var list1 = new int[] { 1, 2, 3 };
var list2 = new int[] { 1 };

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

Console.WriteLine(output);  // prints "2"
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());