LINQ 以基于列查找集合差异

本文关键字:集合 查找 于列 LINQ | 更新日期: 2023-09-27 18:13:56

我有两个列表PersonProduct具有通用的唯一 ID。我想获取 Product 中 ID 与 Person 中的 ID 不匹配的条目。LINQ 查询应该是什么?

List<Person>

ID    Name
1     Abc
3     Xyz

List<Product>

ID    Price
3     400
5     150

预期结果 - 类型 Product 的列表:

ID    Price
5     150

LINQ 以基于列查找集合差异

var result = products.Where(p => !persons.Select(x => x.Id)
                                         .Contains(p.Id));
var persionIDs = new HashSet<int>(persons.Select(person => person.ID));
IEnumerable<Product> invalidProducts = 
                 products.Where(product => !persionIDs.Contains(product.ID));

使用哈希集优化了按人员 ID 查找

简短的方法

products.Where(product => !persons.Any(p => p.ID == product.ID));
使用

内部使用SetsExceptJoin更有效的方法

from prod in products
join pID in products.Select(p => p.ID).Except(persons.Select(pers => pers.ID))
on prod.ID equals pID
select prod;