在第二个不同类型的列表中缺少元素

时间:2016-06-10 07:14:24

标签: c# .net linq

我有两种不同类型的List:

List<class1> list1;
List<class2> list2;

两个实体都有一个名为Id的相同属性。 list1包含10个元素,list2包含200个元素。

我需要根据字段list1获取list2中不在Id的元素列表。

我知道有一个名为Except的Linq运算符,但它只适用于同一类型的两个元素,并假设实体的所有字段都是等号。

2 个答案:

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