Использование HashSet для удаления элементов, не входящих в другую коллекцию, на основе свойства T - PullRequest
0 голосов
/ 19 мая 2018

У меня есть 2 общих списка коллекции, которые содержат разные объекты.Мне нужен список 1, чтобы включить только элементы, в которых свойство этого объекта найдено в другом списке.

В настоящее время я достигаю этого следующим образом:

foreach (var product in navCat.Value.CategoryAssignment.ToArray())
{
    if (!masterCatalog.Product.Any(p => p.ProductId == product.ProductId))
    {
        //this product doesn't exist in the master catalog so lets remove it
        navCat.Value.CategoryAssignment.RemoveAll(p => p.ProductId == product.ProductId);
    }
} 

Это работает хорошо ...но это очень медленно!Каким будет более эффективный способ?Я искал HashSet<T>, но я не уверен, как вызвать Remove, основываясь на свойстве другого списка.

Как бы я использовал HashSet в моем примере, чтобы убедиться, что мой второй список содержит только продуктыкоторые находятся в первом списке?

1 Ответ

0 голосов
/ 19 мая 2018

Вероятно, вы можете просто сделать следующее, по крайней мере, таким образом, вы не страдаете квадратичной временной сложностью O (n * n)

var masterIds = masterCatalog.Product.Select(x => x.ProductId).ToList();

navCat.Value.CategoryAssignment.RemoveAll(x => !masterIds.Contains(x.ProductId));
...