2011-07-01 67 views
6

我有一個2類feeds_Auto產品具有多個匹配屬性。對於這個特定的問題,AutoID是我需要使用的唯一字段。C#列表<object> .RemoveAll() - 如何刪除列表的子集?

我有一個List<FeedsAuto>與幾百獨特的條目。我有一個小的List<Product>與10,20 獨特的條目。我現在想從大列表中刪除小列表中的所有項目。

如何使用RemoveAll({lambda表達式})來完成此操作?我發現的所有例子都取決於簡單類型(字符串,整數等)的通用列表。

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在每個通一個項目。

回答

13

您可以使用Any簡化

source.RemoveAll(a => dropSourceList.Any(b => a.AutoID == b.AutoID)); 

您可以通過創建ID的第一個HashSet減少循環:

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

source.RemoveAll(a => toRemove.Contains(a.AutoID)); 
+0

謝謝!光滑,所有出去。哦,還有很多東西要學習正確使用Lambdas。 :) –