Я пытаюсь выяснить, как пересечь универсальный список объектов, которые я хочу удалить из другого списка объектов.
Так же скажем, у меня есть это как гипотетический пример
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Я хочу пересечь list1 с foreach и удалить каждый объект в List1, который также содержится в List2.
Я не совсем уверен, как пойти, о котором, поскольку foreach не является базирующимся индексом.
Вы можете использовать кроме :
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();
Вам, вероятно, даже не нужны эти временные переменные:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
Обратите внимание, что За исключением того, что
не изменяет ни один из списков - он создает новый список с результатом.
Вот и все ..
List<string> list = new List<string>() { "1", "2", "3" };
List<string> remove = new List<string>() { "2" };
list.ForEach(s =>
{
if (remove.Contains(s))
{
list.Remove(s);
}
});
Вам не нужен индекс, поскольку класс List
позволяет удалять элементы по значению, а не по индексу, используя функцию Remove
.
foreach(car item in list1) list2.Remove(item);
Я бы рекомендовал использовать методы расширения LINQ. Вы можете легко сделать это с помощью одной строки кода, например, так:
list2 = list2.Except(list1).ToList();
Это при условии, конечно, что объекты в списке1, которые вы удаляете из списка2, являются одним и тем же экземпляром.
Вы можете использовать LINQ, но я бы выбрал метод RemoveAll
. Я думаю, что он лучше выражает ваше намерение.
var integers = new List<int> { 1, 2, 3, 4, 5 };
var remove = new List<int> { 1, 3, 5 };
integers.RemoveAll(i => remove.Contains(i));