我有两个包含不同类型的通用列表,为了举例,让我们称它们为Products
and Employees
。我正在尝试查找与员工位于同一地点的产品,即product.SiteId == emp.SiteId
List<Product> lstProds;
List<Employees> lstEmps;
我的(老旧的)大脑告诉我使用forEach
循环查找匹配项,但我怀疑有一种(“更好”/更简洁/更快?)方法可以使用 Linq 来完成此操作。谁能照亮我吗?我在网上找到的所有示例都涉及基元列表(字符串/整数),并且并不是特别有用。
我会说:
var products = from product in lstProds
join employee in lstEmps on product.SiteId equals employee.SiteId
select product;
然而,如果有multiple具有相同站点 ID 的员工,您将多次获得产品。你可以使用Distinct
要解决此问题,或构建一组站点 ID:
var siteIds = new HashSet<int>(lstEmps.Select(emp => emp.SiteId));
var products = lstProds.Where(product => siteIds.Contains(product.SiteId));
这是假设SiteId
is an int
- 如果它是匿名类型或类似的类型,您可能需要一个额外的扩展方法:
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
Then:
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));
Add a ToList
调用任何这些方法来获取List<Product>
而不是IEnumerable<Product>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)