簡體   English   中英

LINQ比較兩個列表並刪除

[英]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 = 1machineId = 1 AND OperationId = 3MachineId =2

我認為它應該是:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));

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中的所有元素” - 后者基本上是一個雙重否定,這總是有點痛苦。

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM