我有两个类 feeds_Auto 和产品,具有多个匹配的属性。对于这个特殊问题,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(????);
}
}
}
要在循环中执行此操作并不困难:
foreach (var drop in dropSourceList)
{
source.RemoveAll(a => a.AutoID == drop.AutoID);
}
在每个传递中为一个项目循环调用RemoveAll对我来说是没有意义的(对我来说)。
答案 0 :(得分:14)
您可以使用Any
来简化
source.RemoveAll(a => dropSourceList.Any(b => a.AutoID == b.AutoID));
您可以通过首先创建HashSet
ID来减少循环:
var toRemove = new HashSet<int>(dropSourceList.ConvertAll(a => a.AutoID));
source.RemoveAll(a => toRemove.Contains(a.AutoID));