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 = 1
, machineId = 1
AND OperationId = 3
, MachineId =2
。
DownloadTask
是否正确覆盖Equals
和GetHashCode
? 如果是这样,您只需要:
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();
请尝试一下它应该工作。