c # сложное сравнение объектов - PullRequest
0 голосов
/ 20 августа 2010
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 кроме метода не работает со сложными объектами.

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

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

Я предполагаю, что у вас есть две IEnumerable<EntityObject> последовательности, и вы хотите знать, как использовать Except таким образом, что два EntityObjects считаются идентичными по определенным критериям. Далее я предполагаю, что эти критерии составляют одно простое правило (просто чтобы облегчить себе жизнь, предоставляя этот ответ): два элемента с одинаковым свойством 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());

Даже если мое предположение относительно критериев было неверным, вы все равно можете использовать этот ответ в качестве основы для формулирования своего собственного.

Если мое первоначальное предположение также было неверным, то, очевидно, этот ответ для вас бесполезен.

1 голос
/ 20 августа 2010

Я не уверен, что ваш код имеет отношение к чему-либо, но вот как вы используете Кроме :

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

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

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