LINQ比较两个列表并删除
本文关键字:两个 列表 删除 比较 LINQ | 更新日期: 2023-09-27 17:50:49
我有两个列表。我想从LIST1中删除LIST2中不存在的任何项目。
例如:
var list1 = new List<DownloadTask>();
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<DownloadTask>();
list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 });
list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 });
运行后,list1
应仅包含项目:组合为operationId = 1
、machineId = 1
和OperationId = 3
、MachineId =2
。
我认为应该是:
list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
DownloadTask
是否正确覆盖Equals
和GetHashCode
?如果是这样,你只需要:
list1 = list1.Intersect(list2).ToList();
当然,如果你很乐意创建一个新的列表。如果你真的想从现有的列表中删除它们,那就稍微困难一点。这可能是最简单的计算结果应该是什么样子,然后清除并重新添加:
var newList = list1.Intersect(list2).ToList();
list1.Clear();
list1.AddRange(newList);
当然,所有这些确实要求您在DownloadTask
中适当地实现相等-但如果您还没有这样做,那么这样做听起来是个好主意。(或者至少在某个地方实现IEqualityComparer<DownloadTask>
-您可以将比较器传递给Intersect
。(
顺便说一句,我认为"只保留list1
中也在list2
中的元素"(即交集(是一种比"从list1
中删除所有不在list2
中的元素"更简单的看待问题的方法——后者基本上是双重否定的,这总是有点痛苦。
var lst = (from lst1 in list1
where !list2.Any(
x => x.OperationID == lst1.OperationID &&
x.MachineID == lst1.MachineID )
select lst1).ToList();
list1 = lst.ToList();
请试试这个,它应该有效。
List<int> equalVal = new List<int>();
equal.AddRange(list1.FindAll(x => list2.Contains(x)));
试试这个,它肯定对你有用。