什么是“现代”的方式来找到两个列表中的常见项</t>。</t>

时间:2011-07-26 09:06:21

标签: c# linq linq-to-objects generic-list

我有两个包含不同类型的通用列表,例如,我们可以调用它们ProductsEmployees。我正在尝试查找与员工位于同一位置的产品,即product.SiteId == emp.SiteId

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

我的(旧skool)大脑告诉我使用forEach循环找到匹配但是我怀疑有一个('更好'/更快/更快?)的方式来使用Linq。任何人都可以照亮我吗?我在网上找到的所有例子都涉及原语列表(字符串/整数),并没有特别的帮助。

1 个答案:

答案 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));

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

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>