2014-07-25 39 views
0

我有2個列表,其中一個是超級集合,另一個是子集。我想要做的是根據ID刪除超集中存在於子集中的所有項目。根據使用LINQ的標準從SuperSet中移除子集

這是我目前做:

var newList = new List<Items>(); 
foreach(var row in superset) 
{ 
    var presentInSubset = subset.Any(r => r.ID == row.ID); 

    if(!presentInSubset) 
    { 
    newList.Add(row) 
    } 
} 

superset = newList; 

我敢肯定有一個較短的方式實現這一目標,而不是這樣做使用LINQ。問題是,如何根據某些標準從超集中刪除子集?

感謝, -Mike

回答

4
superset.RemoveAll(x => subset.Select(y => y.ID).Contains(x.ID)); 
+0

+1現在它的工作:)這是短暫的,可讀的和高效的。 –

2
var cleanList = superSet.Where(s => !subSet.Any(sub => sub.ID == s.ID)).ToList(); 

試試上面。儘管這並不改變原始列表。它會返回一個新的清單。

1

另一個(高效的)方法是使用Enumerable.Join,你需要一個「左外連接」,因爲你希望所有的超級其不在子:

var inSuper = from iSuper in superset 
       join iSub in subset 
       on iSuper.ID equals iSub.ID into gj 
       from subJoin in gj.DefaultIfEmpty() 
       where subJoin == null 
       select iSuper; 
superset = inSuper.ToList(); 

有了這個樣本數據:

var superset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=2}, new Items{ID=3}, 
}; 
var subset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=4}, new Items{ID=3}, 
}; 

只有ID = 2的那個保留,因爲它不在子集中。