我有一个包含整数集合项的集合。我想要做的是从顶级列表中删除作为其他项的扩展子集的项目。
请参阅以下列表作为示例:
项目1:42,40,38,32,50,28,30,51,1 项目2:42,38,32,50,28,30,51,1 项目3:42,50,28,30,51,1 项目4:42,51,1
当我执行代码时,应该从列表中删除除项目4之外的所有项目,因为项目4有扩展名。
下面的代码可以正常工作,但是比我预期的要长一些。请注意,我在集合中有很多项目。
我可以使用Linq或Collections.Set更快地获得相同的结果吗?
目前使用的代码:
Public Sub RemoveExtended()
If Me.Count < 1 Then Exit Sub
Dim endTime As DateTime
Dim start As DateTime
Debug.Print("Processing:" & Me.Count - 1.ToString)
start = Now
For shortestIndex As Integer = 0 To Me.Count - 1
For index As Integer = Me.Count - 1 To shortestIndex + 1 Step -1
If ContainsAll(Me(shortestIndex), Me(index)) Then
Me.RemoveAt(index)
End If
Next
Next
endTime = Now
Debug.Print("removing time:" & endTime.Subtract(start).ToString)
Debug.Print("result :" & Me.Count)
End Sub
Private Function ContainsAll(ByVal shortest As Generic.List(Of Integer), ByVal current As Generic.List(Of Integer)) As Boolean
'slower
'Return shortest.All(Function(x) current.Contains(x))
For Each Item As Integer In shortest
If Not current.Contains(Item) Then
Return False
End If
Next
Return True
End Function
答案 0 :(得分:0)
您可以尝试使用LINQ to check for subset collection更改ContainsAll()
:
If Not Me(shortestIndex).Except(Me(index)).Any() Then
Me.RemoveAt(index)
End If