我有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来确保我的第二个列表仅包含第一个列表中的产品?
答案 0 :(得分:3)
您可能只需执行以下操作,至少这样您就不会遇到二次时间复杂度O(n * n)
var masterIds = masterCatalog.Product.Select(x => x.ProductId).ToList();
navCat.Value.CategoryAssignment.RemoveAll(x => !masterIds.Contains(x.ProductId));