首页 > 解决方案 > 如何删除另一个列表中不存在的值?

问题描述

假设我有两个列表masterupdate,现在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。

我做错了什么?

标签: c#linq

解决方案


首先,让我们修复您的代码 - 当匹配中的任何项目时删除,应该是:updatemaster!===

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));

推荐阅读