LINQ比较两个列表并删除

Sha*_*eKm 11 c# linq

我有两个清单.我想从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 });
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*eKm 25

我认为它应该是:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 15

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

list1 = list1.Intersect(list2).ToList();
Run Code Online (Sandbox Code Playgroud)

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

var newList = list1.Intersect(list2).ToList();
list1.Clear();
list1.AddRange(newList);
Run Code Online (Sandbox Code Playgroud)

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

作为一个方面说明,我认为"只保留中的元素list1也被加list2"(即路口)为寻找比"删除所有元素的问题,一个简单的方法list1其不在list2" -后者基本上是一个双消极,这总是有点痛苦.


小智 5

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

  list1 = lst.ToList();
Run Code Online (Sandbox Code Playgroud)

请试一试它应该工作.