本文需要对C#里的LINQ、Lambda 表达式 、委托有一定了解。
在工作中,经常遇到需要对比两个集合的场景,如:
页面集合数据修改,需要保存到数据库
全量同步上游数据到本系统数据库
在这些场景中,需要识别出需要新增、更新、删除的数据,由于每次应用是,需要比较的对象类型不一致,因此写了个相对通用的方法。这个过程中,需要理解的有以下2个核心概念:
唯一标识比较: 如果两个对象的唯一标识相等,则认为这两个对象在业务上代表同一个东西(次要属性是否相等暂不考虑)。
实体比较:表示两个对象在业务是不是相等(唯一标识相等、次要属性相等)。
代码示例如下:
void Main()
{
// 对比源集合
var source = GenerateStudent(1, 10000, 1000);
// 目标集合
var target = GenerateStudent(5000, 10000, 1000);
// 唯一标识比较
Func keyCompartor = (s, t) => s.Id == t.Id;
// 实体相等比较
Func entityCompartor = (s, t) => s.Id == t.Id && s.Name.Equals(t.Name) && s.Age == t.Age;
// 新增前准备
Func insertAction = (s) =>
{
return new Student
{
Id = s.Id,
Name = s.Name,
Age = s.Age,
Operation = "Insert"
};
};
// 更新前准备
Func updateAction = (s, t) =>
{
t.Name = s.Name;
t.Age = s.Age;
t.Operation = "Update";
return t;
};
// 删除前准备
Func deleteAction = (t) =>
{
t.Operation = "Delete";
return t;
};
// 去掉相等对象
RemoveDuplicate(source, target, entityCompartor, (s1, s2) => s1.Id == s2.Id, keyCompartor);
/