Элементы с обоими свойствами, содержащиеся в списке - PullRequest
2 голосов
/ 15 мая 2019

У меня есть список объектов X (с именем x) со свойствами a и b того же типа Location. У меня также есть список мест y. Мне нужно найти все объекты в x, для которых a И b содержатся в списке y.

Я могу сделать это с помощью циклов и Where s, но так как оба списка огромны, мне нужно действительно хорошее решение. Есть ли способ использовать Intersect в этом случае? Или что-то еще?

Вот какой-то псевдокод

class X
{
    Location a;
    Location b;
}

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

1 Ответ

1 голос
/ 15 мая 2019

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