[英]LINQ compare two lists and remove
我有兩個清單。 我想從 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 = 1
AND OperationId = 3
, MachineId =2
。
我認為它應該是:
list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
DownloadTask
是否正確覆蓋Equals
和GetHashCode
? 如果是這樣,您只需要:
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)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.