在具有公共属性值的两个列表中查找不同类型的元素,每个循环使用两个linq变量

时间:2014-09-10 10:22:40

标签: vb.net performance linq list iequalitycomparer

有两个列表

  1. Myobjects列表包含所有项目,都具有属性“oid” 的ObjectID
  2. ObjectID类型列表是 ALL 对象的列表 删除
  3. 问题是在Myobjects中找到oid属性中具有ObjectID的任何项目。 我很难在LINQ中找到相同的两个“for each”循环。 这应该很容易,但我做错了。在30 000个项目上执行此LINQ需要20秒,并且使用for-each循环在一秒内执行此LINQ。下面是 for-each 循环,我试图使 LINQ (这个很慢)。 Linq解决方案就是我想要的。

            For Each i As LengthAreaObject In myobjects
                For Each o As ObjectId In oidsToRem
                    If i.oid = o Then
                        returnlist.Add(i)
                        oidsToRem.Remove(o)
                        Exit For
                    End If
    
                Next
            Next
    

    和LINQ在这里尝试

    Dim rlist As List(Of LengthAreaObject) = (From i As LengthAreaObject In myobjects.AsParallel Where oidsToRem.Contains(i.oid) Select i).ToList
    

2 个答案:

答案 0 :(得分:0)

收藏品有多少物品?

对于小型集合,由于额外的方法调用,AsParallel会更慢。

答案 1 :(得分:0)

我找到了类似问题on stackoverflow并对其进行了修改。 因此,加快速度的解决方案仅仅是哈希集合,其中您测试的对象是"包含"。否则,包含很慢!

Dim setToRemove = New HashSet(Of ObjectId)(oidstoRem)
   Dim returnlist As List(Of LengthAreaObject) = lengthAreaList.AsParallel.Where(Function(x) setToRemove.Contains(x.oid)).ToList