使用具有通用标识符的不同列表应用删除范围

本文关键字:列表 应用 删除 范围 标识符 | 更新日期: 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));