什么是'现代'在两个列表中查找公共项目的方法[lt;T>]的对象
本文关键字:方法 项目 对象 lt 列表 现代 什么 两个 查找 | 更新日期: 2023-09-27 18:03:37
我有两个包含不同类型的泛型列表,为了便于示例,我们称它们为Products
和Employees
。我正试图找到基于与员工相同位置的产品,即product.SiteId == emp.SiteId
List<Product> lstProds;
List<Employees> lstEmps;
我的(旧学校)大脑告诉我使用forEach
循环来找到匹配,但我怀疑有一个("更好"/更简洁/更快?)的方法来做它使用Linq。有人能给我点灯吗?我在网上找到的所有示例都是处理原语列表(字符串/int)的,并且不是特别有用。
我会说:
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>
。