Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除其他列表中不存在的值?_C#_Linq - Fatal编程技术网

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))来说不是问题;