检查两个集合中是否存在相同的元素

53

我在想Linq是否有一种方法可以检查两个集合是否至少有一个共同元素。我期望的代码如下:

var listA = new List<int>() { some numbers };
var listB = new List<int>() { some numbers, potentially also in list A };

bool hasSameElements = listA.hasMatchingElements(listB);

在 Linq 中是否存在此功能,还是我应该编写自定义方法?

我知道 Intersect 方法,但这难道不会生成整个交集集合吗?我只想检查两个集合是否有交集,生成整个集合似乎是一种浪费,特别是对于更大的集合。


Intersect 只返回被要求的元素数。如果您使用 AnyFirstOrDefault 或在第一次迭代时中断 foreach,它只会找到两个列表中存在的_第一个_元素(如果有的话)- 它不会去查找剩下的。 - Rawling
1
然而需要注意的是,Intersect 操作要求在第一个元素被生成之前完全读取两个序列中的 一个 序列。如果您的输入之一是无限的,请确保它不是被完全消耗的输入。请注意,Intersect规范说明 在描述它的工作方式时是有误导性的。 - Rawling
1个回答

113
听起来你只是想要:
bool hasSameElements = listA.Intersect(listB).Any();

编辑:如评论中所述,Intersect使用惰性求值。它将所有的执行推迟到从结果中读取第一个元素时;在那一点上,它将加载listB中的所有元素到一个集合中,然后流式传输listA直到找到一个要产生的结果。在那时,Any()将返回true,因此不会再做更多的工作。请参阅我的Edulinq关于Intersect的文章以获取更多信息。

15
不,它不会。Any方法在返回一个项后就会停止(除非整个集合为空),而Intersect使用延迟执行,因此它会在遇到每个项目时输出它。这将非常高效。 - Servy
1
@zeebonk:不是这样的 - 请参阅http://msmvps.com/blogs/jon_skeet/archive/2010/12/30/reimplementing-linq-to-objects-part-16-intersect-and-build-fiddling.aspx了解详情。 - Jon Skeet
1
@zeebonk:添加了比那更多的信息。它有点急切...但只在一个序列上。 (这可能会改变您使用listA.Intersect(listB)还是listB.Intersect(listA)。) - Jon Skeet
@JonSkeet 您帖子中的链接和评论中的链接都已失效。 - The Muffin Man
1
@TheMuffinMan:我有机会时会修复这篇文章。在那之前,你可以通过搜索找到它。 - Jon Skeet
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接