2011-07-01 12 views
6

Birden çok eşleme özelliğine sahip 2 sınıf feeds_Auto ve Ürün var. Bu sorun için, kullanmam gereken tek alan AutoID'dir.C# Liste <object> .RemoveAll() - Listenin bir alt kümesi nasıl kaldırılır?

ile birkaç yüz benzersiz girişleri var. 10, 20 ile benzersiz girişleri ile küçük bir List<Product> var. Şimdi küçük listedeki tüm öğeleri büyük listeden kaldırmak istiyorum.

Bunu yapmak için RemoveAll'i ({lambda expression}) nasıl kullanırım? Bulduğum tüm örnekler, jenerik listenin basit türlere (dizgiler, inters, vb.) Bağlı olduğuna inanıyor.

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(????); 
     } 
    } 
} 

bir döngü içinde Bunu yapmak için zor değildir:

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

Sadece her geçişte bir öğe için removeAll aramak için bir sette döngü (bana) mantıklı değil.

cevap

13

Sen kimliği ilk bir HashSet oluşturarak döngü azaltabilir

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

basitleştirmek için Any kullanabilirsiniz:

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

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

Teşekkür! Hepsi dışarı çıkarken kaygan. Oh hala Lambdas'ı doğru kullanmayı öğrenmek için. :) –

İlgili konular