Удалить элементы из одного списка в другом
Я пытаюсь понять, как пройти общий список элементов, которые я хочу удалить из другого списка элементов.
Итак, скажем, у меня это как гипотетический пример
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();
Ответ 8
бесплатный секс: http://sheswaitingforyou.blogspot.com Найти девушку до ххх в вашем районе.
Ответ 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);
}
});