Whats the 'modern' way to find common items in two Lists<T> of objects?

丶灬走出姿态 提交于 2019-11-30 09:04:16

I would say:

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

However, if there are multiple employees with the same site ID, you'll get the products multiple times. You could use Distinct to fix this, or build a set of site IDs:

var siteIds = new HashSet<int>(lstEmps.Select(emp => emp.SiteId));

var products = lstProds.Where(product => siteIds.Contains(product.SiteId));

That's assuming SiteId is an int - if it's an anonymous type or something similar, you may want an extra extension method:

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

Alternatively, if you have few employees, this will work but is relatively slow:

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

Add a ToList call to any of these approaches to get a List<Product> instead of an IEnumerable<Product>.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!