2010-08-18 5 views
2

У меня есть объект, который содержится в списке <>, мне нужно, чтобы удалить их из другого списка <>Удаление объектов, содержащихся в списке <> из другого списка <>?

например,

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

... Есть ли что-то такое, что SearchResults содержит подмножество объектов, содержащихся в 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 (SearchResults). К списку();

+0

Вам нужно пометить 'ToList' слово в конце, если вы хотите, чтобы результат будет' 'Список , а не' 'IEnumerable , – LukeH

3

Следующее предоставит вам список, в котором все в SearchResults было удалено.

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

Вы могли бы сделать:

AllElements = results.AsList(); 
+1

Есть ли возможность использовать Where/Contains, чтобы просто использовать Except? –

+1

@ Justin, для меня было выгодно, что я знал о способе «Where()» для этого. Я понятия не имел, что вы можете использовать 'Except()'. Я отправил свой ответ одновременно с вашим, и я оставлю его, потому что он прав, и хорошо знать другие способы делать что-то. – jjnguy

+3

(s): Между ними существует семантическая разница. «За исключением» создает заданную разницу в двух последовательностях, что означает, что любые дубликаты также удаляются. Например, если две последовательности являются «{1, 2, 3, 5, 1, 2, 4}» и «{3, 4}», то использование 'Except' даст вам последовательность' {1, 2, 5 } ', тогда как' Where'/'Contains' даст вам' {1, 2, 5, 1, 2} '. – LukeH

Смежные вопросы