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

c# .net list

160102 просмотра

8 ответа

19194 Репутация автора

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

Так скажем, у меня есть это в качестве гипотетического примера

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

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

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

Автор: PositiveGuy Источник Размещён: 30.04.2010 03:14

Ответы (8)


31 плюса

156436 Репутация автора

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

foreach(car item in list1) list2.Remove(item);
Автор: Adam Robinson Размещён: 30.04.2010 03:15

326 плюса

632826 Репутация автора

Решение

Вы можете использовать кроме :

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

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

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

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

Автор: Mark Byers Размещён: 30.04.2010 03:16

22 плюса

622 Репутация автора

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

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

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

Автор: Berkshire Размещён: 30.04.2010 03:18

-4 плюса

11122 Репутация автора

Вот и ты ..

    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);
            }
        });
Автор: Ian P Размещён: 30.04.2010 03:18

13 плюса

46160 Репутация автора

Вы могли бы использовать 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));
Автор: João Angelo Размещён: 30.04.2010 03:22

5 плюса

1528 Репутация автора

Решение 1: Вы можете сделать так:

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

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

Решение 2:

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

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

 var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();
Автор: nzrytmn Размещён: 01.07.2015 06:08

16 плюса

306 Репутация автора

В моем случае у меня было два разных списка с общим идентификатором, вроде внешнего ключа. Второе решение, цитируемое "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();
Автор: Gabriel Santos Reis Размещён: 07.08.2015 03:27

11 плюса

161 Репутация автора

list1.RemoveAll(l => list2.Contains(l));
Автор: Alexandre Amado de Castro Размещён: 08.05.2017 06:44
32x32