我认为这需要O(A x B)
时间来执行。
(其中A为收藏品A的大小,B为收藏品B的大小)
我说的对吗?
IEnumerable<A> GetMatches(IEnumerable<A> collectionA, IEnumerable<B> collectionB)
{
foreach (A a in collectionA)
foreach (B b in collectionB)
if (a.Value == b.Value)
yield return a;
}
有没有更快的方法来执行这个查询(可能使用LINQ?)
最佳答案
不幸的是,Enumerable.Intersect
在比较两种不同类型(A
和B
)时不会起作用。
这需要单独处理一点才能得到一个有效的intersect调用。
你可以分阶段进行:
IEnumerable<A> GetMatches(IEnumerable<A> collectionA, IEnumerable<B> collectionB)
where A : ISomeConstraintWithValueProperty
where B : ISomeOtherConstraintWithSameValueProperty
{
// Get distinct values in A
var values = new HashSet<TypeOfValue>(collectionB.Select(b => b.Value));
return collectionA.Where(a => values.Contains(a.Value));
}
注意,如果
collectionB
包含重复项(但不包含collectionA),则返回重复项,因此其结果与循环代码的结果略有不同。如果需要唯一匹配项(仅返回一个),可以将最后一行更改为:
return collectionA.Where(a => values.Contains(a.Value)).Distinct();