Skip to main content
 首页 » 编程设计

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

2024年02月25日26qlqwjy

我有 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 来确保我的第二个列表只包含第一个列表中的产品?

请您参考如下方法:

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

var masterIds = masterCatalog.Product.Select(x => x.ProductId).ToList(); 
 
navCat.Value.CategoryAssignment.RemoveAll(x => !masterIds.Contains(x.ProductId));