2014-02-11 58 views
2

我有一個按預期工作的查詢。如果mastercollection不存在於MyCollection的相應AssocaitedProp然後從MyCollection的使用linq從集合中刪除項目

public class classB 
{ 
    public classX AssociatedProp { get; set; } 
} 

    List<classX> MyCollection; 
    List<classB> masterCollection; 

    MyCollection.RemoveAll(x => 
        MyCollection.Except(
        (from n in masterCollection 
         select n.AssociatedProp).Distinct()).ToList().Contains(x) 
        ); 

此查詢中刪除該項目將刪除所有來自MyCollection的其不在masterCollection的項目。

現在我已經修改MyCollection的作爲classC

的收集
public class classC 
{ 
    bool flag { get; set; } 
    classX myObj { get; set; } 
} 

List<classC> myCollection; 
List<classB> masterCollection; 

和 列表MyCollection的

我怎樣才能達到同樣的效果。即如果masterCollection在MyCollection中沒有任何具有ClassX值的項目,則刪除MyCollection中的所有項目。

我知道解釋不夠清楚。

回答

3
var toKeep = new HashSet(masterCollection.Select(x => x.AssociatedProp)); 

foreach(var x in myCollection.Where(i => toKeep.Contains(i.myObj) == false).ToList()) 
{ 
    myCollection.Remove(x); 
} 

您想將搜索列表帶入lambda之外,否則重新創建每個項目。您還需要HashSet,因爲它們是搜索速度最快的集合。