我有两个清单.我想从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 });
Run Code Online (Sandbox Code Playgroud)
运行后list1应该只包含项目:组合operationId = 1,machineId = 1AND OperationId = 3, MachineId =2.
Sha*_*eKm 25
我认为它应该是:
list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 15
是否DownloadTask覆盖Equals和GetHashCode是否正确?如果是这样,您只需要:
list1 = list1.Intersect(list2).ToList();
Run Code Online (Sandbox Code Playgroud)
如果你很高兴创建一个新的列表,当然.如果你真的想从现有的列表中删除它们,那就稍微困难了.最简单的方法是找出结果应该是什么样子,然后清除并重新添加:
var newList = list1.Intersect(list2).ToList();
list1.Clear();
list1.AddRange(newList);
Run Code Online (Sandbox Code Playgroud)
当然,所有这些都需要你适当地实现相等DownloadTask- 但如果你还没有这样做,那么听起来这样做是个好主意.(或者至少在IEqualityComparer<DownloadTask>某处实现- 你可以将比较器传递给Intersect.)
作为一个方面说明,我认为"只保留中的元素list1也被加list2"(即路口)为寻找比"删除所有元素的问题,一个简单的方法list1其不在list2" -后者基本上是一个双消极,这总是有点痛苦.
小智 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();
Run Code Online (Sandbox Code Playgroud)
请试一试它应该工作.
| 归档时间: |
|
| 查看次数: |
24456 次 |
| 最近记录: |