Удалить элементы из списка 1, а не в список 2 - PullRequest
29 голосов
/ 01 ноября 2010

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

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);
}

Ответы [ 4 ]

60 голосов
/ 01 ноября 2010

Вы можете сделать это через RemoveAll, используя Contains:

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

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

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

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

10 голосов
/ 29 августа 2017

Решение для объектов (возможно, проще, чем решение для horaces):

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

    var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId));
9 голосов
/ 27 августа 2013
list = list.Except(list2).ToList();
9 голосов
/ 27 апреля 2012

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

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

Когда я понял это, я произвел рефакторинг класса item для реализации 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 ()) отлично сработал для меня.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...