CodeGo.net>如何获取不同类型的集合之间的匹配?

我认为这将花费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();
上一篇:Trajectory Optimization


下一篇:php_uname()有多快?