什么是'现代'在两个列表中查找公共项目的方法[lt;T>]的对象

本文关键字:方法 项目 对象 lt 列表 现代 什么 两个 查找 | 更新日期: 2023-09-27 18:03:37

我有两个包含不同类型的泛型列表,为了便于示例,我们称它们为ProductsEmployees。我正试图找到基于与员工相同位置的产品,即product.SiteId == emp.SiteId

List<Product> lstProds;
List<Employees> lstEmps;

我的(旧学校)大脑告诉我使用forEach循环来找到匹配,但我怀疑有一个("更好"/更简洁/更快?)的方法来做它使用Linq。有人能给我点灯吗?我在网上找到的所有示例都是处理原语列表(字符串/int)的,并且不是特别有用。

什么是'现代'在两个列表中查找公共项目的方法[lt;T>]的对象

我会说:

var products = from product in lstProds
               join employee in lstEmps on product.SiteId equals employee.SiteId
               select product;

但是,如果有多个员工具有相同的站点ID,您将多次获得产品。您可以使用Distinct来解决这个问题,或者建立一组站点id:

var siteIds = new HashSet<int>(lstEmps.Select(emp => emp.SiteId));
var products = lstProds.Where(product => siteIds.Contains(product.SiteId));

假设SiteId是一个int -如果它是一个匿名类型或类似的东西,你可能需要一个额外的扩展方法:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
    return new HashSet<T>(source);
}

:

var siteIds = lstEmps.Select(emp => emp.SiteId).ToHashSet();
var products = lstProds.Where(product => siteIds.Contains(product.SiteId));

或者,如果你的员工很少,这将工作,但相对较慢:

var products = lstProds.Where(p => lstEmps.Any(emp => p.SiteId == emp.SiteId));

在这些方法中添加ToList调用,以获得List<Product>而不是IEnumerable<Product>