我有 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));
