如何根据另一个列表的元素和条件从一个列表中删除元素?
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();
如何使用 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 } };