Удалить элементы из одного списка в другом

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

Итак, скажем, у меня это как гипотетический пример

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

Я хочу пересечь list1 с помощью foreach и удалить каждый элемент в List1, который также содержится в List2.

Я не совсем уверен, как это сделать, поскольку foreach не основан на индексе.

Ответ 1

Вы можете использовать За исключением:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

Вам, вероятно, даже не нужны эти временные переменные:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

Обратите внимание, что Except не изменяет ни один из них - он создает новый список с результатом.

Ответ 2

Вам не нужен индекс, так как класс List<T> позволяет удалять элементы по значению, а не индексу, используя функцию Remove.

foreach(car item in list1) list2.Remove(item);

Ответ 3

Я бы рекомендовал использовать методы расширения LINQ. Вы можете легко сделать это с помощью одной строки кода:

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

Это предполагает, что объекты в списке1, которые вы удаляете из списка2, являются одним и тем же экземпляром.

Ответ 4

Вы можете использовать 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));

Ответ 5

В моем случае у меня было два разных списка с общим идентификатором, вроде внешнего ключа. Второе решение, указанное в "nzrytmn" :

var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

Был ли тот, который лучше всего вписывался в мою ситуацию. Мне нужно было загрузить DropDownList без записей, которые уже были зарегистрированы.

Спасибо!!!

Это мой код:

t1 = new T1();
t2 = new T2();

List<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();

ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();

Ответ 6

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

Ответ 7

Решение 1. Вы можете сделать следующее:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

Но в некоторых случаях это решение не работает. если это не работа, вы можете использовать мое второе решение.

Решение 2:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

мы делаем вид, что list1 - ваш основной список, а list2 - ваш вторичный список, и вы хотите получить элементы списка1 без элементов списка2.

 var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

Ответ 9

Здесь ya go..

    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);
            }
        });