Как удалить элементы из одного списка на основе элемента и условия другого списка? - PullRequest
0 голосов
/ 05 декабря 2018

Как удалить элементы списка из list1, что соответствует условию с list2 элементами, используя LINQ без дубликатов

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

Как это сделать, используя Linq?

Список ввода

list1 = new List(){new object{id = 40},new object{id = 50},new object{id = 60}}
list2 = new List(){new object{id = 400},new object{id = 50},new object{id = 600}}

Ожидаемый вывод долженот list1

new object{id = 40},new object{id = 60}

Ответы [ 6 ]

0 голосов
/ 09 декабря 2018

Следующий код работал для меня:

var list1 = new List<a> { new a { id = 40 }, new a { id = 50 }, new a { id = 60 } }; 
var list2 = new List<a> { new a { id = 400 }, new a { id = 50 }, new a { id = 600 } }; 

var exceptedItems = list1.Select (x => x.id) .Except (list2.Select (y => y.id)). ToList();

0 голосов
/ 05 декабря 2018

Я бы решил это с помощью оператора Join:

var l = list1.Join(list2, outer => outer.Key, inner => inner.Key, (inner, outer) => outer);

, где outer - это list1, а inner - это list2.В результате получается список, содержащий все элементы с одинаковым Key, при условии, что Key является свойством элементов.

0 голосов
/ 05 декабря 2018

Вы также можете попробовать

list1.addRange(list2)
then next line would be a simple list1.Distinct(X=>x.Key1).ToList();

ИЛИ будет просто:

list1.Except(list2,IEqualityComparer);

Для этого вам потребуется реализовать метод equals.

Другойможно было бы реализовать Union

var result = List1.Union(List2, myEqualityComparer);

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

0 голосов
/ 05 декабря 2018

В другой перспективе,

var list1 = Provider.FillList<SomeType>();
var list2 = Provider.FillList<SomeType>();
list1.RemoveAll(n=> list2.Exists(o=> o.Key == n.Key));
0 голосов
/ 05 декабря 2018

Попробуйте это:

var list = list1.RemoveAll(l => list2.Contains(l));
0 голосов
/ 05 декабря 2018

Вы можете удалить элементы следующим образом:

list1.RemoveAll(item => list2.Any(item2 => item.Key == item2.Key))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...