lamda 对比两个list_使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象...

本文需要对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);

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要找出两个数组中不同的数,可以使用以下方法。首先,将两个数组分别存储在nums1和nums2中。然后,创建一个空的列表answer,用于存储不同的数。接下来,使用for循环遍历nums1中的数,判断是否在nums2中,如果不在,则将其添加到answer\[0\]中。然后,再使用for循环遍历nums2中的数,判断是否在nums1中,如果不在,则将其添加到answer\[1\]中。为了避免重复的数出现在answer中,可以使用set函数来去除重复的数。最后,输出answer即可得到不同的数。\[1\] 示例代码如下: ``` nums1 = \[1, 2, 3, 4, 5, 6, 7\] nums2 = \[1, 2, 3, 4\] answer = \[\[\], \[\]\] for i in set(nums1): if i not in nums2: answer\[0\].append(i) for j in set(nums2): if j not in nums1: answer\[1\].append(j) print(answer) ``` 输出结果为:\[\[5, 6, 7\], \[\]\],表示nums1中的不同数为\[5, 6, 7\],nums2中的不同数为空列表。\[2\] 另外,还可以使用其他方法实现,比如使用filter函数和indexOf函数来筛选不同的数。具体代码如下: ``` nums1 = \[1, 2, 3, 4, 5, 6, 7\] nums2 = \[1, 2, 3, 4\] res1 = \[\] res2 = \[\] res = \[\] res1.append(list(filter(lambda x: x not in nums2, nums1))) res2.append(list(filter(lambda x: x not in nums1, nums2))) res = res1\[0\] + res2\[0\] print(res) ``` 输出结果为:\[5, 6, 7\],与之前的方法得到的结果相同。\[3\] #### 引用[.reference_title] - *1* *2* [找出两数组的不同](https://blog.csdn.net/gschen_cn/article/details/124010765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [比较两个数组,找出不一样的数据组成新数组](https://blog.csdn.net/qq_37600506/article/details/122602819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值