列表中包含两个属性的项目

时间:2019-05-15 11:09:44

标签: c# performance linq intersect

我有一个对象X(名称为x)的列表,它们具有属性ab,具有相同的类型Location。我也有位置列表y。我需要找到xa包含在列表b中的y中的所有对象。

我可以使用循环和Where来做到这一点,但是由于两个列表都很庞大,因此我需要一个性能很好的解决方案。在这种情况下,有什么方法可以使用Intersect?还是其他?

这里有一些伪代码

class X
{
    Location a;
    Location b;
}

GetMatches(List<X> x, List<Location> y) { ?? }

1 个答案:

答案 0 :(得分:1)

首先将y列表转换为HashSet

var yHashSet = y.ToHashSet();

然后轻松快速地找到匹配项:

private static List<X> GetMatches(List<X> x, HashSet<Location> y)
{
    return x
        .Where(item => y.Contains(item.a) && y.Contains(item.b))
        .ToList();
}

使其平行以变得更快:

private static List<X> GetMatchesParallel(List<X> x, HashSet<Location> y)
{
    return x
        .AsParallel()
        .Where(item => y.Contains(item.a) && y.Contains(item.b))
        .ToList();
}