C#List.RemoveAll() – 如何删除列表的子集?

前端之家收集整理的这篇文章主要介绍了C#List.RemoveAll() – 如何删除列表的子集?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有2个类Feed_Auto和具有多个匹配属性的Product.对于这个特殊问题,AutoID是我需要使用的唯一字段.

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

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

  1. private static int DoInserts(ref List<Model.Feeds_Auto> source,ref List<Model.Product> target,Guid companyID)
  2. {
  3. List<Model.Product> newProductList = new List<Model.Product>();
  4. List<Model.Product> dropSourceList = new List<Model.Product>();
  5.  
  6. using (var db = Helpers.GetProdDB())
  7. {
  8. foreach (var src in source)
  9. {
  10. var tgt = target.Where(a => a.alternateProductID == src.AutoID && a.LastFeedUpdate < src.DateModified).FirstOrDefault();
  11. if (tgt == null)
  12. {
  13. newProductList.Add(new Model.Product{...});
  14. dropSourceList.Add(src);
  15. }
  16. }
  17. db.SaveChanges();
  18.  
  19. if (dropSourceList.Count > 0)
  20. {
  21. source.RemoveAll(????);
  22. }
  23. }
  24. }

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

  1. foreach (var drop in dropSourceList)
  2. {
  3. source.RemoveAll(a => a.AutoID == drop.AutoID);
  4. }

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

解决方法

您可以使用Any来简化
  1. source.RemoveAll(a => dropSourceList.Any(b => a.AutoID == b.AutoID));

您可以通过首先创建ID的HashSet来减少循环:

  1. var toRemove = new HashSet<int>(dropSourceList.ConvertAll(a => a.AutoID));
  2.  
  3. source.RemoveAll(a => toRemove.Contains(a.AutoID));

猜你在找的C&C++相关文章