2010-08-18 158 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

相關問題