我猜它没有,但如果有人可以确认。
如果我尝试交叉两组: A(100万件) B(1项)
框架总是做A.Contains(B)一次,而不是B.Contains(A)一百万次吗?
这假设在引擎盖下的交叉是如何工作的,与我不知道的一些奇特的算法相反。
更新
好的,对于c#,你应该清楚地做B.InsersectWith(A)
,如果B<< A. Intersect()
在IEnumerable
上定义,根据以下答案(和MSDN)效率会低很多。因此,如果您使用最佳工具IntersectWith()
。
答案 0 :(得分:3)
来自文档
如果其他参数表示的集合是具有与当前HashSet对象相同的相等比较器的HashSet集合,则此方法是O(n)操作。否则,此方法是O(n + m)操作,其中n是Count,m是其他元素的数量。
如果您正在寻找速度实现(覆盖)GetHashCode,如果您可以从数据中派生出有意义的哈希值。并覆盖Equal。我为任何将在集合中的类执行此操作。
答案 1 :(得分:0)
这取决于您是作为一般性问题或特定语言提出的。
在Java中,它将遍历第二个集合,然后遍历第一个集合以查看它是否包含该元素。所以它仍会迭代两组。
在c#中,该方法的作用是枚举第一组(A)的元素,然后枚举第二组(B)的元素并标记那些常见的元素,之后它会产生那些元素。顺序。
所以,为了回答你的问题,我会说它没有。这是必须通过每个容器
答案 2 :(得分:0)
代码编写为一般情况。如果您是这样的特殊情况,则应该实现对您的特定用例有效的自定义逻辑。
Contains()方法只是遍历列表,直到找到匹配为止,所以顺序肯定是重要的,如果这就是它正在做的事情,但我相信另一个答案就其工作原理而言是正确的,因为表示每个项目最多迭代一次,而“Contains”解决方案可以迭代主列表中每个元素的整个“子”列表。
实际解决方案= x + y次迭代 包含solution = x +(x * y)迭代