C# 使用HashSet删除不在基于T属性的另一个集合中的项
我有两个包含不同对象的通用列表集合。 我需要列表1只包含在另一个列表中找到该对象属性的项 目前,我正在实现以下目标:C# 使用HashSet删除不在基于T属性的另一个集合中的项,c#,list,collections,hashset,C#,List,Collections,Hashset,我有两个包含不同对象的通用列表集合。 我需要列表1只包含在另一个列表中找到该对象属性的项 目前,我正在实现以下目标: foreach (var product in navCat.Value.CategoryAssignment.ToArray()) { if (!masterCatalog.Product.Any(p => p.ProductId == product.ProductId)) { //this product doesn't exist i
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
,但我不确定如何基于另一个列表的属性调用Remove
在我的示例中,如何使用哈希集来确保第二个列表只包含第一个列表中的产品?您可能只需执行以下操作,至少这样您不会遇到二次时间复杂性O(n*n)
为什么不试试
varids=masterCatalog.Product.Select(x=>x.ProductId.ToArray()代码>navCat.Value.CategoryAssignment.RemoveAll(x=>!ids.Contains(x.ProductId))代码>
var masterIds = masterCatalog.Product.Select(x => x.ProductId).ToList();
navCat.Value.CategoryAssignment.RemoveAll(x => !masterIds.Contains(x.ProductId));