我有两种不同类型的列表:
List<class1> list1;
List<class2> list2;
两个实体都有一个名为 Id
的相同属性。
list1
包含 10 个元素,list2
包含 200 个元素。
我需要根据字段Id
获取list1
中不在list2
中的元素列表。
我知道有一个名为 Except 的 Linq 运算符, 但它仅适用于同一类型的两个元素,并假设实体的所有字段都相等。
最佳答案
随着列表规模的增长,给出的其他答案将无法很好地扩展。提高性能的一个简单更改是将异常列表转换为 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();
关于c# - 获取第二个不同类型列表中缺少的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742120/