C# 如何删除其他列表中不存在的值?
假设我有两个列表C# 如何删除其他列表中不存在的值?,c#,linq,C#,Linq,假设我有两个列表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
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
我做错了什么?首先,让我们修复您的代码-当
更新中的任何项与主项匹配时,您将删除,因此=代码>应为==
:
master.RemoveAll(c => !update.Any(x => x.Id == c.Id));
这就是你所需要的,比如说,1000件左右的物品清单。如果列表是,比如说,10000个项目,由于上述算法的O(n2)性质,这可能会变慢。您可以将update
的ID放入HashSet
中,并使用Contains
进行潜在的加速:
var updateIds = new HashSet<int>(update.Select(u => u.Id));
master.RemoveAll(m => !updateId.Contains(m.Id));
var updateIds=newhashset(update.Select(u=>u.Id));
master.RemoveAll(m=>!updateId.Contains(m.Id));
您正在寻找:
master.RemoveAll(c => !update.Any(x => x.Id == c.Id));
您要查找的是方法Intersect
(带有扭曲)。你需要一个相等比较器
Intersect:通过使用默认相等比较器来比较值,生成两个序列的集合交点
第一个解决方案:覆盖等于
输出
1
3
5
1
3
5
1
3
5
第二种解决方案:创建自定义比较器
试试这个
var listMaster = new List<Master>();
var listUpdate = new List<Update>();
listMaster.Add(new Master { ID = 1, Name = "Jai" });
listMaster.Add(new Master { ID = 2, Name = "Ram" });
listMaster.Add(new Master { ID = 3, Name = "Amit" });
listMaster.Add(new Master { ID = 4, Name = "Mohan" });
listMaster.Add(new Master { ID = 5, Name = "JAg" });
listUpdate.Add(new Update { ID = 1, Name = "JaiU" });
listUpdate.Add(new Update { ID = 2, Name = "RamU" });
listUpdate.Add(new Update { ID = 3, Name = "ShyamU" });
listMaster.RemoveAll(c => !listUpdate.Any(x => x.ID == c.ID));
var listMaster=new List();
var listUpdate=新列表();
Add(新主机{ID=1,Name=“Jai”});
Add(新主机{ID=2,Name=“Ram”});
Add(新主机{ID=3,Name=“Amit”});
Add(新主机{ID=4,Name=“Mohan”});
Add(新主机{ID=5,Name=“JAg”});
Add(新的更新{ID=1,Name=“JaiU”});
Add(新的更新{ID=2,Name=“RamU”});
Add(新的更新{ID=3,Name=“ShyamU”});
RemoveAll(c=>!listUpdate.Any(x=>x.ID==c.ID));
可用于模拟相交:
输出
1
3
5
1
3
5
1
3
5
我喜欢性能提示,但我的列表最多可以获得400条记录,因此这对于memmaster.RemoveAll(I=>!update.Exists(k=>k.id==I.id))来说不是问题;