比较同一类的列表
本文关键字:一类 列表 比较 | 更新日期: 2023-09-27 18:30:18
我有两个列表,我想将它们与更新/修改的列进行比较。比较同一类的 2 个列表,并在新列表中显示不同的值我想使用 linq 来做到这一点。唯一的问题是我正在处理很多列,每列超过 30 列。任何建议都会有很大帮助...
//In Dal
List<PartnerAndPartnerPositionEntity> GetAllPartnerAndPartnerPositionOldDB(int modelId);
List<PartnerAndPartnerPositionEntity> GetAllPartnerAndPartnerPosition(int modelId);
//BL
//get from new db
var list1= _partnerDAL.GetAllPartnerAndPartnerPosition(modelId);
//get from old db
var list2= _partnerDAL.GetAllPartnerAndPartnerPositionOldDB(modelId);
假设:
-
PartnerAndPartnerPositionEntity
类包含一个名为Id
的属性,该属性表示项的唯一键
鉴于上述情况,您可以:
获取类型的所有属性
var properties = typeof(PartnerAndPartnerPositionEntity).GetProperties();
联接 Id
属性上的两个列表,并循环访问属性以查看哪个列表已更改:
var list = list1.Join(list2,
x => x.Id,
y => y.Id,
(x, y) => Tuple.Create(x, y))
.ToList();
list.Foreach(tuple =>
{
foreach(var propertyInfo in properties)
{
var value1 = propertyInfo.GetValue(tuple.Item1, null);
var value2 = propertyInfo.GetValue(tuple.Item2, null);
if(value1 != value2)
Console.WriteLine("Item with id {0} has different values for property {1}.",
tuple.Item1,Id, propertyInfo.Name);
}
});
好吧,如果你想避免以无聊和乏味的方式做到这一点,你需要使用反射来动态获取类成员,然后获取每个实例的值。请参阅 C# 反射 - 从代码的简单类中获取字段值。
那里...这将生成新的 IL!
public static class EqualityHelper
{
private ConcurrentDictionary<Type, object> _cache = new ConcurrentDictionary<Type, object>();
public bool AreEqual<T>(T left, T right)
{
var equality = (Func<T,T,bool>)_cache.GetOrAdd(typeof(T), CreateEquality<T>());
return equality(left, right);
}
private Func<T, T, bool> CreateEquality<T>()
{
var left = Expression.Parameter(typeof(T));
var right = Expression.Parameter(typeof(T));
var properties = from x in typeof(T).GetProperties()
where x.GetIndexParameters().Any() == false
select x;
var expressions = from p in properties
select Expression.Equal(
Expression.Property(left, p),
Expression.Property(right, p));
var body = expressions.Aggregate(Expression.AndAlso);
var lambda = Expression.Lambda<Func<T,T,bool>>(body, new [] {left, right});
return lambda.Compile();
}
}