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 = 1machineId = 1OperationId = 3MachineId =2

LINQ比较两个列表并删除

我认为应该是:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));

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

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)));

试试这个,它肯定对你有用。