c# - 如何删除另一个列表中不存在的值?
问题描述
假设我有两个列表master
和update
,现在master
列表包含表中可用的所有记录,并且列表仅包含需要更新update
的一些记录。master
我想从列表中排除master
所有未包含在update
列表中的记录,所以我尝试了:
master.RemoveAll(c => update.Any(x => x.Id != c.Id));
这将返回 0。
记录是:
list_name | id
master 1
master 2
master 3
master 4
master 5
update 3
update 4
update 5
最后,master
列表应仅包含记录:3、4、5。
我做错了什么?
解决方案
首先,让我们修复您的代码 - 当匹配中的任何项目时删除,应该是:update
master
!=
==
master.RemoveAll(c => !update.Any(x => x.Id == c.Id));
这就是 1000 项左右的列表所需的全部内容。如果列表是 10,000 个项目,由于上述算法的O(n 2 ) 特性,这可能会变慢。您可以将 IDupdate
放入HashSet
, 并Contains
用于潜在的加速:
var updateIds = new HashSet<int>(update.Select(u => u.Id));
master.RemoveAll(m => !updateId.Contains(m.Id));
推荐阅读
- php - 带有 apache 虚拟端口的 phpCHART 不起作用
- python - 错误:错误:(-215:断言失败)samples.cols == var_count && samples.type() == 5 in function 'cv::ml::SVMImpl::predict'
- sql - 复杂的SQL查询帮助请
- error-handling - 如何处理 nuxtjs 插件中的 axios onError 并向用户显示适当的错误消息
- database - 数据管道,用于通过相互非循环依赖的模块运行数据记录
- javascript - 如何用JS添加类
- symfony - 导出导入的宏
- javascript - 单击下一个/上一个链接时如何关闭菜单?
- c# - Datagrid 视图 - 无法对数据进行排序
- sql - 我应该在哪里输入 DISTINCT?