我认为这需要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在比较两种不同类型(AB)时不会起作用。
这需要单独处理一点才能得到一个有效的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();

09-25 22:09