使用具有通用标识符的不同列表应用删除范围
本文关键字:列表 应用 删除 范围 标识符 | 更新日期: 2023-09-27 18:31:06
在我的例子中,我有两个不同的列表,有一个共同的标识符。如何根据一些公共属性从列表 1 中删除 list2。以为我有两个清单。
class A
{
public int Id {get;set;}
public int Roll{get;set;}
}
class B
{
public int Id {get;set;}
public int Ro{get;set;}
}
var Acollection = new List<A>();
Acollection.Add(new A{Id=1,Roll=1});
Acollection.Add(new A{Id=2,Roll=2});
var Bcollection = new List<B>();
Bcollection.Add(new B{Id=1,Ro=3});
Bcollection.Add(new B{Id=3,Ro=2});
现在我想从 A 中删除 B,其中 Id 相同。
可以使用 LINQ Where
方法,如下所示:
Acollection =
Acollection
.Where(a => Bcollection.All(b => a.Id != b.Id))
.ToList();
如果BCollection
很大并且您担心性能,则可以使用如下所示的HashSet
:
HashSet<int> bad_ids = new HashSet<int>();
Bcollection.ForEach(b => bad_ids.Add(b.Id));
Acollection =
Acollection
.Where(a => !bad_ids.Contains(a.Id))
.ToList();
您可以使用
List<T>.RemoveAll(Predicate<T>)
:
Acollection.RemoveAll(a => Bcollection.Any(b => b.Id == a.Id));
为了加快速度,您可以先将 id 放在哈希表中:
var ids = new HashSet<int>(Bcollection.Select(b => b.Id));
Acollection.RemoveAll(a => ids.Contains(a.Id));