比较 .NET 对象 - 比较 2 个列表

问题描述 投票:0回答:2

我有 2 个对象列表。在进行比较时如何忽略 Car 的某些属性?我已经尝试过 MembersToIgnore 和 AttributesToIgnore 但它似乎无法识别它,并且它仍然返回差异中的那些属性。当我只是尝试比较 2 辆汽车时,它工作得很好,当我比较列表时,我怎么能忽略这些属性呢?

List<Car> lst1
List<Car> lst2

CompareLogic compare = new CompareLogic();
ComparisonResult res = compare.Compare(lst1,lst2);
c# .net compare compare-net-objects
2个回答
1
投票

您需要使用自定义比较器

例如:

public class SpecialCarComparer: BaseTypeComparer
{
    public SpecialCarComparer(RootComparer rootComparer) : base(rootComparer)
    {
    }

    public SpecialCarComparer() : this(RootComparerFactory.GetRootComparer())
    {
    }

    public override bool IsTypeMatch(Type type1, Type type2)
    {
        return type1 == typeof(Car);
    }

    public override void CompareType(CompareParms parms)
    {
        Car car1 = parms.Object1 as Car;
        Car car2 = parms.Object2 as Car;
        

        if (car1?.SomeCarProperty != car2?.SomeCarProperty || car1?.AnotherCarProperty > 100 || car2?.AnotherCarProperty < 100)
        {
            AddDifference(parms);
        }
    }
}

然后使用它:

CompareLogic compareLogic = new CompareLogic();
compareLogic.Config.CustomComparers.Add(new SpecialCarComparer());
ComparisonResult result = compareLogic.Compare(obj1, obj2);

0
投票

我正在使用 CompareNETObjects 4.79.0,它的工作方式就像一个魅力。我能够将复杂类型与子类型进行比较,同时使用以下比较配置忽略多个字段或子类型

Ex obj

ComplexPerson complexPerson1 = new ComplexPerson
{
    Id = "complexPers1",
    Date = new DateTime(2020, 2, 1),
    Person = new Person
    {
        Name = "Foo",
        LastName = "Bar"
    },
    Address = new Address
    {
        Street = "Street 1",
        PostalCode = "4321",
        City = "New York"
    },
    Batch = new Batch
    {
        Id = 1,
        Date = new DateTime(2020, 1, 1),
    }
};

ComplexPerson complexPerson2 = new ComplexPerson
{
    Id = "complexPers2",
    Date = new DateTime(2020, 2, 1),
    Person = new Person
    {
        Name = "Foo",
        LastName = "Bar"
    },
    Address = new Address
    {
        Street = "Street 2",
        PostalCode = "4321",
        City = "New York"
    }
};
ComparisonConfig complexComparisonConfig = new ComparisonConfig
{
  IgnoreObjectTypes = true,//will compare properties and ignore type of the types
  MembersToIgnore = new List<string> { nameof(ComplexPerson.Id), nameof(ComplexPerson.Batch), nameof(ComplexPerson.Address.Street) }
    };
ComparisonResult comparisonResult = new CompareLogic(comparisonConfig).Compare(complexPerson1, complexPerson2); //comparisonResult.AreEqual will be true 

但在这里我通常将一个对象与另一个对象进行比较,而不是列表。对于 comapring 列表,为什么不执行 linq join 来查找两个列表中的匹配项,然后将两个对象相互比较?

© www.soinside.com 2019 - 2024. All rights reserved.