Удалите элементы из одного списка <T>, которые находятся в другом

У меня есть два списка

 List<T> list1 = new List<T>();
 List<T> list2 = new List<T>();

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

Спасибо!

Ответы

Ответ 1

Чтобы изменить фактический список1 на месте, вы можете использовать

list1.RemoveAll(item => list2.Contains(item));

Вместо этого вы можете просто запросить список, не изменяя

var result = list1.Except(list2);

LukeH дает хорошие рекомендации в комментариях. В первой версии, и если list2 особенно велика, возможно, стоит загрузить список в HashSet<T> перед вызовом RemoveAll. Если список небольшой, не беспокойтесь об этом. Если вы не уверены, проверьте оба способа, а затем вы узнаете.

var theSet = new HashSet<YourType>(list2);
list1.RemoveAll(item => theSet.Contains(item));

Ответ 2

С LINQ:

var result = list1.Except(list2);

Ответ 3

list1.RemoveAll( item => list2.Contains(item));

Ответ 4

Описание

Я думаю, вы имеете в виду общий тип List<Type>. Вы можете использовать Linq для этого

Пример

List<string> l = new List<string>();
List<string> l2 = new List<string>();

l.Add("one");
l.Add("two");
l.Add("three");

l2.Add("one");
l2.Add("two");
l2.Add("three");
l2.Add("four");

l2.RemoveAll(x => l.Contains(x));

Дополнительная информация

Ответ 5

var result = list1.Except(list2);

Ответ 6

Используя LINQ, вы можете сделать это:

 List1.RemoveAll(i => !List2.Contains(i));

Ответ 7

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

list1 = list1.Except(list2).ToList()

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