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 ли 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(); 

Пожалуйста, попробуйте, это должно сработать.