【问题标题】:c# complex objects comparisonc# 复杂对象比较
【发布时间】:2026-01-08 10:35:01
【问题描述】:
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 except 方法不适用于复杂对象。

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

【问题讨论】:

  • 在您提供的代码中,我没有看到 list1、list2 或 except 方法......请澄清。

标签: c# ienumerable except


【解决方案1】:

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

那么,对Except 使用接受IEqualityComparer&lt;T&gt; 的重载:

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());

即使我对标准的猜测是错误的,您仍然可以将此答案作为制定您自己的答案的基础。

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

【讨论】:

    【解决方案2】:

    我不确定你的代码与什么有什么关系,但这里是你如何使用Except

    var list1 = new int[] { 1, 2, 3 };
    var list2 = new int[] { 1 };
    
    var output = list1.Except(list2).First();
    
    Console.WriteLine(output);  // prints "2"
    

    【讨论】: