2010-11-01 2 views
25

Я учусь написать lambda expressions, и мне нужна помощь по удалению всех элементов из списка, которые не находятся в другом списке.Удалить элементы из списка 1 не в списке 2

var list = new List<int> {1, 2, 2, 4, 5}; 
var list2 = new List<int> { 4, 5 }; 

// Remove all list items not in List2 
// new List Should contain {4,5}  
// The lambda expression is the Predicate. 
list.RemoveAll(item => item. /*solution expression here*/); 

// Display results. 
foreach (int i in list) 
{ 
    Console.WriteLine(i); 
} 

ответ

49

Вы можете сделать это с помощью RemoveAll с помощью Содержит:

list.RemoveAll(item => !list2.Contains(item)); 

В качестве альтернативы, если вы просто хотите, пересечение, используя Enumerable.Intersect будет более эффективным:

list = list.Intersect(list2).ToList(); 

Разница заключается в том, в последнем случае вы не будете получать повторяющиеся записи. Например, если list2 содержит 2, в первом случае вы получите {2,2,4,5}, во втором - {2,4,5}.

+0

см. Мое усиление этого ответа (см. Ниже), если вы сравниваете объекты, а не скаляры – horace

8

Этот вопрос отмечен как ответ, но есть улов. Если ваш список содержит объект, а не скаляр, вам нужно сделать немного больше работы.

Я пробовал это снова и снова с помощью Remove() и RemoveAt() и всех видов, и никто из них не работал правильно. Я не мог даже заставить Contains() работать правильно. Никогда ничего не соответствовало. Я был в тупике, пока не получил подозрение, что, возможно, он не мог правильно подобрать элемент.

Когда я это понял, я реорганизовал класс для реализации IEquatable, а затем он начал работать.

Вот мое решение:

class GenericLookupE : IEquatable<GenericLookupE> 
{ 
    public string ID { get; set; } 

    public bool  Equals(GenericLookupE other) 
    { 
     if (this.ID == other.ID)  return true; 

     return false; 
    } 
} 

После того как я сделал это, выше RemoveAll() ответ Рид Copsey работал отлично для меня.

См: http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

2

Легче решение для объектов, чем Гораций дал:

Если список содержит объект, а не скаляр, это просто, путем удаления от одного выбранного свойства объектов:

var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId)); 
Смежные вопросы