如何根据另一个列表的元素和条件从一个列表中删除元素?

How to Remove elements from one List based another list's element and condition?

如何使用 LINQ 从 list1 中删除与 list2 项匹配的列表项而不重复

我知道如何以简单的 foreach 方式做到这一点,但我想要使用 Linq 风格的单行代码。

如何使用 Linq

Input list

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

Expected Output should from list1

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

您可以像这样删除元素:

list1.RemoveAll(item => list2.Any(item2 => item.Key == item2.Key))

试试这个:

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

换个角度,

var list1 = Provider.FillList<SomeType>();
var list2 = Provider.FillList<SomeType>();
list1.RemoveAll(n=> list2.Exists(o=> o.Key == n.Key));

你也可以试试

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

或者简单的

list1.Except(list2,IEqualityComparer);

您需要实现 equals 方法才能使其正常工作。

另一种方法是实施联盟

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

它使用与除此之外相同的逻辑,有几种方法可以使用 link 来欺骗最终结果,其中大多数方法效率低下并且计算时间长

我会用 Join 语句解决这个问题:

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

其中 outer 是列表 1,inner 是列表 2。结果是一个包含所有具有相同 Key 的元素的列表,假设 Key 是一个 属性 的元素。

以下代码对我有用:

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