Удаление списка объектов из другого списка - PullRequest
7 голосов
/ 03 октября 2011

Я искал что-то подобное несколько дней.Я пытаюсь удалить все элементы из большего списка A в соответствии со списком B.

Предположим, что я получил общий список из 100 элементов с разными IDS, и я получил еще один список с конкретными элементами всего с 10записей.Мне нужно удалить все элементы из первого списка, который не существует во втором списке.

Я попытаюсь показать код, который я на самом деле не знаю, как он не работает.

List<Obj> listA = new List<Obj>(); 
List<Obj> listB = new List<Obj>(); 

//here I load my first list with many elements
//here I load my second list with some specific elements

listA.RemoveAll(x => !listB.Contains(x));

Я не знаю почему, но он не работает.Если я попробую этот пример с типом List<int>, он прекрасно работает, но я бы хотел сделать это с моим объектом.Этот объект получил идентификатор, но я не знаю, как использовать этот идентификатор в предложении LINQ.

Ответы [ 4 ]

23 голосов
/ 03 октября 2011

Вам необходимо сравнить идентификаторы:

listA.RemoveAll(x => !listB.Any(y => y.ID == x.ID));

List (T) .RemoveAll

3 голосов
/ 04 октября 2011

Я полагаю, что вы можете использовать расширение Кроме , чтобы сделать это.

var result = listA.Except(listB)

Ссылка: http://www.dotnetperls.com/except

2 голосов
/ 31 октября 2016

Если вы хотите удалить список объектов (listB) из другого списка (listA), используйте:

listA = listA.Except(listB).ToList()

Не забудьте использовать ToList () для преобразования IEnumerable<Obj> в List<Obj>.

0 голосов
/ 03 октября 2011

В соответствии с документацией по MSDN (http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx), содержит, использует компаратор равенства по умолчанию для определения равенства, поэтому вы можете использовать метод Equals IEquatable в вашем классе Obj, чтобы он работал. HiperiX упоминает сравнение ссылок выше.

Как добавить интерфейс IEquateable: http://msdn.microsoft.com/en-us/library/ms131190.aspx

...