C# 两个列表-获取公共字段?

C# 两个列表-获取公共字段?,c#,linq,C#,Linq,我有两个列表。对象中的字段是party_id 有没有一种方法,使用LINQ,只获取公共party_id的列表?那么,也许加入Party ID上的列表,然后返回匹配的列表 在SQL中,我想我应该: SELECT DISTINCT party_id FROM table1 INNER JOIN table2 on table1.party_id = table2.party_id 谢谢。你可以试试这个: table1.Select(r => r.party_id).Intersect(tab

我有两个
列表
。对象中的字段是party_id

有没有一种方法,使用LINQ,只获取公共party_id的列表?那么,也许加入Party ID上的列表,然后返回匹配的列表

在SQL中,我想我应该:

SELECT DISTINCT party_id FROM table1
INNER JOIN table2 on table1.party_id = table2.party_id
谢谢。

你可以试试这个:

table1.Select(r => r.party_id).Intersect(table2.Select(r => r.party_id))
怎么样

var results = list1.Where(f => list2.Exists(s => f.party_id == s.party_id))
                   .Select(x => x.party_id);

如果不拉出Reflector并验证上述可行解决方案的实现,我认为使用
Join(…)
将是最有效的:


在我看来,如果不进行尽职调查,提供你甚至没有调查或解释其有效性的微观优化是没有太大帮助的。@Kirk,你的批评是公平的。然而,除非您事先知道列表很小,否则它几乎不是一个微观优化。此外,您甚至可能不知道列表是在内存中还是在数据库中,在这种情况下,查询的结构肯定会起作用。@jonnyGold任何值得一看的数据库,以及大多数不值得一看的玩具数据库,都会使用哈希表实现
intersect
作为
O(M+N)
。内存中的Intersect也是如此:它应该是
O(M+N)
,而不是
O(M*N)
@jonnyGold“如果这是在内存中使用Linq to对象,同样的事情也适用。”事情不是这样的:你可以下载.NET的源代码,自己检查一下。
Enumerable.cs
的第756行通过调用
IntersectIterator
来实现
Intersect
;第765行通过从
second
创建一组项来实现
IntersectIterator
,然后将
first
迭代到
yield return
一组不同的项。@jonnyGold“你能解释为什么这不是second*first相等比较吗?”哈希集插入和查找都是
O(1)
操作,因此,总数是
O(秒+首)
var party_on_dude = from table1
                    join table2 on table1.party_id equals table2.party_id
                    select table1.party_id;