2011-07-01 7 views
6

私は2つのクラスを持っていますfeeds_AutoProduct複数の一致プロパティを備えています。この特定の問題については、AutoIDは私が使用する必要がある唯一のフィールドです。C#List <object> .RemoveAll() - リストのサブセットを削除するには?

私は、List<FeedsAuto>に数百ユニークなのエントリを持っています。私は小さなList<Product>と10,20,のユニークなのエントリを持っています。私は今大リストから小さなリストのすべての項目を削除したいと思います。

これを達成するためにRemoveAll({lambda expression})を使用するにはどうすればよいですか?私が見つけたすべての例は、単純な型(文字列、intなど)のジェネリックリストに依存しています。ループ内でこれを行うには

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

それはちょうど、各パスに1つの項目にREMOVEALLを呼び出すためにセットにループに(私には)意味がありません。

答えて

13

あなたはあなたがIDの最初のHashSetを作成することによって、ループを減らすことができます

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

を簡素化するためにAnyを使用することができます。

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

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

感謝を!すべてが抜け出すとスリック。ああ、Lambdasを正しく使うことを学ぶことはまだまだあります。 :) –

関連する問題