C#List <object> .RemoveAll() - 如何删除列表的子集?

Kei*_*ows 7 c# generics collections lambda

我有2个类feed_Auto和具有多个匹配属性的Product.对于这个特殊问题,AutoID是我需要使用的唯一字段.

我有List<FeedsAuto>几百个独特的条目.我有一个小List<Product>的10,20个独特的条目.我现在想要从大列表中删除小列表中的所有项目.

如何使用RemoveAll({lambda expression})来完成此任务?我发现的所有示例都取决于通用列表是简单类型(字符串,整数等).

private static int DoInserts(ref List<Model.feeds_Auto> source, ref List<Model.Product> target, Guid companyID)
{
    List<Model.Product> newProductList = new List<Model.Product>();
    List<Model.Product> dropSourceList = new List<Model.Product>();

    using (var db = Helpers.GetProdDB())
    {
        foreach (var src in source)
        {
            var tgt = target.Where(a => a.alternateProductID == src.AutoID && a.LastFeedUpdate < src.DateModified).FirstOrDefault();
            if (tgt == null)
            {
                newProductList.Add(new Model.Product{...});
                dropSourceList.Add(src);
            }
        }
        db.SaveChanges();

        if (dropSourceList.Count > 0)
        {
            source.RemoveAll(????);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要在循环中执行此操作并不困难:

foreach (var drop in dropSourceList)
{
    source.RemoveAll(a => a.AutoID == drop.AutoID);
}
Run Code Online (Sandbox Code Playgroud)

对于我来说,循环一个集合来为每个传递中的一个项目调用RemoveAll是没有意义的.

Sam*_*eff 14

您可以使用Any简化

source.RemoveAll(a => dropSourceList.Any(b => a.AutoID == b.AutoID));
Run Code Online (Sandbox Code Playgroud)

您可以通过首先创建HashSetID 来减少循环:

var toRemove = new HashSet<int>(dropSourceList.ConvertAll(a => a.AutoID));

source.RemoveAll(a => toRemove.Contains(a.AutoID));
Run Code Online (Sandbox Code Playgroud)