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

时间:2018-12-05 11:32:35

标签: c# linq c#-4.0

如何使用LINQ从list1删除与list2项目匹配条件的列表项目

我知道如何以简单的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 :(得分:3)

您可以删除以下元素:

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

答案 1 :(得分:1)

尝试一下:

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

答案 2 :(得分:0)

换一种说法,

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

答案 3 :(得分:0)

您也可以尝试

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

除了使用相同的逻辑外,还有其他几种方法可以使用链接来欺骗最终结果,其中大多数方法效率低下并且计算时间较长

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

以下代码对我有用:

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

varexceptedItems = list1.Select(x => x.id).Except(list2.Select(y => y.id))。ToList();