Удалите элементы из одного списка <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>
.