LINQ比较两个列表并删除

我有两个清单。 我想从LIST1中删除LIST2中不存在的任何项目。

例如:

var list1 = new List(); list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 }); list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 }); list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); var list2 = new List(); list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

运行后list1应仅包含项目:组合operationId = 1machineId = 1 AND OperationId = 3MachineId =2

DownloadTask是否正确覆盖EqualsGetHashCode ? 如果是这样,您只需要:

 list1 = list1.Intersect(list2).ToList(); 

如果你很高兴创建一个新列表,当然。 如果你真的想从现有的列表中删除它们,那就稍微困难了。 最简单的方法是找出结果应该是什么样子,然后清除并重新添加:

 var newList = list1.Intersect(list2).ToList(); list1.Clear(); list1.AddRange(newList); 

当然,所有这些需要你在DownloadTask适当地实现相等 – 但如果你还没有这样做,听起来这样做是个好主意。 (或者至少在某处实现IEqualityComparer – 您可以将比较器传递给Intersect 。)

作为旁注,我认为“仅将list1中的元素保留在list2 ”(即交集)作为查看问题的简单方法,而不是“从list1删除不在list2中的所有元素” – 后者基本上是一个双重否定,这总是有点痛苦。

我认为它应该是:

 list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID)); 
  var lst = (from lst1 in list1 where !list2.Any( x => x.OperationID == lst1.OperationID && x.MachineID == lst1.MachineID ) select lst1).ToList(); list1 = lst.ToList(); 

请尝试一下它应该工作。