11

我有两个清单。我想从 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 = 1AND OperationId = 3, MachineId =2.

4

4 回答 4

28

我认为应该是:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
于 2013-01-07T07:18:01.007 回答
19

是否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” - 后者基本上是双重的消极的,这总是有点痛苦。

于 2013-01-07T07:19:19.613 回答
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();

请试试这个它应该工作。

于 2013-01-07T07:33:14.303 回答
0
List<int> equalVal = new List<int>();
equal.AddRange(list1.FindAll(x => list2.Contains(x)));

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

于 2022-01-20T14:02:56.377 回答