我有两种不同类型的List:
List<class1> list1;
List<class2> list2;
两个实体都有一个名为Id
的相同属性。
list1
包含10个元素,list2
包含200个元素。
我需要根据字段list1
获取list2
中不在Id
的元素列表。
我知道有一个名为Except的Linq运算符,但它只适用于同一类型的两个元素,并假设实体的所有字段都是等号。
答案 0 :(得分:3)
随着您的列表大小的增长,提供的其他答案将无法很好地扩展。一个简单的更改是使异常列表变为HashSet。如果Id属性是一个整数,它看起来像这样:
var exceptIds = new HashSet<int>(list2.Select(y => y.Id).Distinct());
var unmatched = list1.Where(x => !exceptIds.Contains(x.Id)).ToList();
unmatched.Dump(); // LinqPad method, to see output
如果Id的类型是其他类型,只需将其替换为第一行作为泛型类型参数。
或者,您可以使用左连接技术生成相同的不匹配输出,就像SQL中的“查找不匹配的记录”查询一样。
var unmatched = (from item in list1
join item2 in list2 on item.Id equals item2.Id into grp
from x in grp.DefaultIfEmpty()
where x == null
select item).ToList();
答案 1 :(得分:1)
这个怎么样:
var exceptIds = list2.Select(y => y.Id).Distinct().ToList();
list1 = list1.Where(x => !exceptIds.Contains(x.Id)).ToList();