2010-08-18 223 views
2

我有一个包含在清单<>中的对象,我需要从另一个清单中删除这些清单<>从另一个List <>中移除包含在List <>中的对象?

例如,

List<MyObject> AllElements = new List<MyObject>(); 
List<MyObject> SearchResults = new List<MyObject>(); 

...做一些让SearchResult所包含包含在AllResults

对象的一个​​子集

目前,我这样做是为了从主列表中删除它们:

for(int i = 0; i < SearchResults.Count; i++) 
    AllElements.Remove(SearchResults[i]); 

是否有更好[linqier!]的方式?

回答

5

IEnumerable<T>.Except是你的朋友(如果我正确地读你的例子):

allElements = allElements.Except(searchResults); 
8

可以使用Enumerable.Except Method(从MSDN)

列表<MyObject> FilteredElements = AllElements.Except(SearchResult所)。 ToList();

+0

你需要标记一个'ToList'在结束通话,如果你想要得到的结果是一个'名单'而不是'IEnumerable的' 。 – LukeH 2010-08-18 21:00:50

3

以下将给你一个列表,其中SearchResults中的所有内容都被删除。

var results = AllElements.Where(i => !SearchResults.Contains(i)); 

你可以再做:

AllElements = results.AsList(); 
+1

使用Where/Contains作为简单使用Except有什么好处? – 2010-08-18 18:42:56

+1

@Justin,对我来说好处是我知道“Where()”的方式。我不知道你可以使用'Except()'。我同时发布了我的答案,因为它是正确的,而且我很想知道其他方法来做事情。 – jjnguy 2010-08-18 18:57:12

+3

(s):它们之间也存在语义差异。 “Except”产生两个序列的集合差异,这意味着任何重复也被删除。例如,如果两个序列是“{1,2,3,5,1,2,4}”和“{3,4}”,那么使用“Except”会给出序列“{1,2,5 }'而使用'Where' /'Contains'会给你'{1,2,5,1,2}'。 – LukeH 2010-08-18 21:10:23