Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HashSet删除不在基于T属性的另一个集合中的项_C#_List_Collections_Hashset - Fatal编程技术网

C# 使用HashSet删除不在基于T属性的另一个集合中的项

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

我有两个包含不同对象的通用列表集合。 我需要列表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
,但我不确定如何基于另一个列表的属性调用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));