Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是';现代';在两个列表中查找常用项的方法<;T>;什么是物体?_C#_Linq_Linq To Objects_Generic List - Fatal编程技术网

C# 什么是';现代';在两个列表中查找常用项的方法<;T>;什么是物体?

C# 什么是';现代';在两个列表中查找常用项的方法<;T>;什么是物体?,c#,linq,linq-to-objects,generic-list,C#,Linq,Linq To Objects,Generic List,我有两个包含不同类型的通用列表,例如,让我们称它们为产品和员工。我试图找到与员工位于同一位置的产品,即product.SiteId==emp.SiteId List<Product> lstProds; List<Employees> lstEmps; 列出lstProds; 列出LSTEMP; 我(以前的skool)的大脑告诉我使用forEach循环来查找匹配项,但我怀疑有一种使用Linq的(“更好”/更简洁/更快”)方法。有人能照亮我吗?我在网上找到的所有示例都涉

我有两个包含不同类型的通用列表,例如,让我们称它们为
产品
员工
。我试图找到与员工位于同一位置的产品,即
product.SiteId==emp.SiteId

List<Product> lstProds;
List<Employees> lstEmps;
列出lstProds;
列出LSTEMP;
我(以前的skool)的大脑告诉我使用
forEach
循环来查找匹配项,但我怀疑有一种使用Linq的(“更好”/更简洁/更快”)方法。有人能照亮我吗?我在网上找到的所有示例都涉及原语(字符串/整数)列表,并不是特别有用。

我想说:

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));
然后:

或者,如果您的员工很少,这将起作用,但速度相对较慢:

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

向这些方法中的任何一种添加
ToList
调用,以获得
List
而不是
IEnumerable

非常感谢Skeet先生。我不得不稍微修改语法以使其起作用-使用==测试是否相等,显然是不正确的?VS告诉我它的“预期上下文关键字”等于“”。用等号替换==似乎能奏效,但在这一点上我不知道为什么?你能详细说明一下吗?@5arx:对不起,是的,修好了。这只是查询表达式语法的一部分-实际上并不是提供单个表达式(
product.SiteId==employee.SiteId
)来检查每一对。相反,您将提供两个投影(
product.SiteId
employee.SiteId
),它们将应用于每侧的每个元素一次,然后比较键是否相等。确定。我想我慢慢开始明白了。多谢:-)
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));