我有 2 个对象列表。在进行比较时如何忽略 Car 的某些属性?我已经尝试过 MembersToIgnore 和 AttributesToIgnore 但它似乎无法识别它,并且它仍然返回差异中的那些属性。当我只是尝试比较 2 辆汽车时,它工作得很好,当我比较列表时,我怎么能忽略这些属性呢?
List<Car> lst1
List<Car> lst2
CompareLogic compare = new CompareLogic();
ComparisonResult res = compare.Compare(lst1,lst2);
您需要使用自定义比较器。
例如:
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);
我正在使用 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 来查找两个列表中的匹配项,然后将两个对象相互比较?