使用HashSet根据T的属性删除不在另一个集合中的项目

时间:2018-05-19 00:35:22

标签: c# list collections hashset

我有2个包含不同对象的通用List集合。 我需要列表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 :(得分:3)

您可能只需执行以下操作,至少这样您就不会遇到二次时间复杂度O(n * n)

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

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