I have two lists. I want to remove any items from LIST1 that are NOT present in LIST2.
So for example:
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 });
After run list1
should contain only items: with combination operationId = 1
, machineId = 1
AND OperationId = 3
, MachineId =2
.
Does DownloadTask
override Equals
and GetHashCode
correctly? If so, all you need is:
list1 = list1.Intersect(list2).ToList();
That's if you're happy to create a new list, of course. If you really want to remove them from the existing list, it's slightly harder. It would quite possibly be simplest to work out what the result should look like, then clear and re-add:
var newList = list1.Intersect(list2).ToList();
list1.Clear();
list1.AddRange(newList);
Of course, all of this does require you to implement equality appropriately in DownloadTask
- but if you haven't done so already, it sounds like it would be a good idea to do so. (Or at least implement IEqualityComparer<DownloadTask>
somewhere - you can pass a comparer to Intersect
.)
As a side note, I view "only keep the elements in list1
which are also in list2
" (i.e. intersection) as a simpler way of looking at the problem than "remove all elements from list1
which aren't in list2
" - the latter is basically a double negative, which is always a bit of a pain.
I think it should be:
list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With