Я пытаюсь выяснить, как пройти общий список элементов, которые я хочу удалить из другого списка элементов.
Так скажем, у меня есть это в качестве гипотетического примера
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Я хочу пройти через list1 с помощью foreach и удалить каждый элемент в List1, который также содержится в List2.
Я не совсем уверен, как это сделать, поскольку foreach не основан на индексах.
list1
существующих вlist2
или вы хотите удалить элементы изlist2
существующих вlist1
? Во время этого комментария каждый предоставленный ответ будет выполнять последний.Ответы:
Вы можете использовать кроме :
Возможно, вам даже не нужны эти временные переменные:
Обратите внимание, что
Except
ни один из этих списков не изменяется - он создает новый список с результатом.источник
IEnumerable<car>
, а неList<car>
. Вам нужно позвонить,ToList()
чтобы получить список обратно. Кроме того, я считаю, что это должно бытьGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
если у вас его не было раньше.Except
как это фактически выполняет операцию установки , которая отличает результирующий список. Я не ожидал такого поведения, поскольку использую, аList
неHashSet
. Связанный.Вам не нужен индекс, так как
List<T>
класс позволяет вам удалять элементы по значению, а не индексировать с помощьюRemove
функции.источник
list2.Remove(item);
утверждения.list1.ForEach(c => list2.Remove(c));
Я бы порекомендовал использовать методы расширения LINQ . Вы можете легко сделать это с одной строкой кода следующим образом:
Это, конечно, при условии, что объекты в списке list1, которые вы удаляете из списка list2, являются одним и тем же экземпляром.
источник
В моем случае у меня было два разных списка с общим идентификатором, вроде внешнего ключа. Второе решение, цитируемое "nzrytmn" :
Был тот, который лучше всего подходит в моей ситуации. Мне нужно было загрузить DropDownList без записей, которые уже были зарегистрированы.
Спасибо !!!
Это мой код:
источник
Вы могли бы использовать LINQ, но я бы пошел с
RemoveAll
методом. Я думаю, что именно он лучше выражает ваши намерения.источник
источник
O(N)
, это приведет к тому,O(N^2)
что могут возникнуть проблемы с большими списками.Решение 1: Вы можете сделать так:
Но в некоторых случаях это решение может не сработать. если это не работа, вы можете использовать мое второе решение.
Решение 2:
мы притворяемся, что list1 - это ваш основной список, а list2 - ваш вторичный список, и вы хотите получить элементы list1 без элементов list2.
источник
Так
Except
как список не изменяется, вы можете использовать ForEach наList<T>
:Возможно, это не самый эффективный способ, но он прост, поэтому удобочитаем, и обновляет исходный список (это мое требование).
источник
Вот и ты ..
источник