我认为这将花费O(A x B)的时间来执行.
(其中A是collectionA的大小,B是collectionB的大小)
我对么?
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();