Сначала преобразуйте список 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();
}