我有两个包含不同类型的通用列表,例如,我们可以调用它们Products
和Employees
。我正在尝试查找与员工位于同一位置的产品,即product.SiteId == emp.SiteId
List<Product> lstProds;
List<Employees> lstEmps;
我的(旧skool)大脑告诉我使用forEach
循环找到匹配但是我怀疑有一个('更好'/更快/更快?)的方式来使用Linq。任何人都可以照亮我吗?我在网上找到的所有例子都涉及原语列表(字符串/整数),并没有特别的帮助。
答案 0 :(得分:17)
我会说:
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>
。