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

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

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

List list1 = GetTheList(); List list2 = GetSomeOtherList(); 

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

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

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

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

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

 List result = GetSomeOtherList().Except(GetTheList()).ToList(); 

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

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

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

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

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

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

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

 var integers = new List { 1, 2, 3, 4, 5 }; var remove = new List { 1, 3, 5 }; integers.RemoveAll(i => remove.Contains(i)); 

В моем случае у меня было два разных списка с общим идентификатором, вроде внешнего ключа. Второе решение, процитированное «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 list1 = t1.getList(); List list2 = t2.getList(); ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList(); ddlT3.DataTextField = "AnyThing"; ddlT3.DataValueField = "IdAnyThing"; ddlT3.DataBind(); 
 list1.RemoveAll(l => list2.Contains(l)); 

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

 List result = GetSomeOtherList().Except(GetTheList()).ToList(); 

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

Решение 2:

 List list1 = GetTheList(); List list2 = GetSomeOtherList(); 

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

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

Вот ты иди ..

  List list = new List() { "1", "2", "3" }; List remove = new List() { "2" }; list.ForEach(s => { if (remove.Contains(s)) { list.Remove(s); } }); 
  • Как передать объект в список общего типа в F #
  • Преобразование списка в массив в Java
  • Списки эликсиров интерпретируются как списки символов
  • пользовательская строка в списке?
  • Удалить дубликаты в списке (Prolog)
  • Использование LINQ для удаления элементов из списка
  • Android listview с проблемой флажка
  • Найти наиболее распространенный элемент в списке
  • Добавить значение в пустой вектор в R?
  • Python - создать список с номерами между двумя значениями?
  • Значение не может быть нулевым. Имя параметра: элементы (DrodownList)
  • Давайте будем гением компьютера.