Удалить элементы из списка 1, а не в список 2

#define VARIABLE 3
#define NAME2(fun,suffix) fun ## _ ## suffix
#define NAME1(fun,suffix) NAME2(fun,suffix)
#define NAME(fun) NAME1(fun,VARIABLE)

int NAME(some_function)(int a);

Честно говоря, вы не хотите знать, почему это работает. Если вы знаете, почему это работает, вы станете этим парнем на работе, который знает такие вещи, и все придут задавать вам вопросы. =)

Редактирование: если вы действительно хотите знать, почему это работает, я с радостью опубликую объяснение, полагая, что меня никто не бьет.

29
задан Paolo Moretti 20 October 2012 в 12:03
поделиться

4 ответа

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

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

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

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

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

60
ответ дан Reed Copsey 20 October 2012 в 12:03
поделиться

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

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

    var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId));
10
ответ дан M.Buschmann 20 October 2012 в 12:03
поделиться
list = list.Except(list2).ToList();
9
ответ дан Vuttipong L. 20 October 2012 в 12:03
поделиться

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

Я пробовал это снова и снова с помощью 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

.
9
ответ дан horace 20 October 2012 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: