Linq列表子集删除

时间:2014-07-16 10:55:52

标签: linq set

我有一个包含整数集合项的集合。我想要做的是从顶级列表中删除作为其他项的扩展子集的项目。

请参阅以下列表作为示例:

项目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

1 个答案:

答案 0 :(得分:0)

您可以尝试使用LINQ to check for subset collection更改ContainsAll()

If Not Me(shortestIndex).Except(Me(index)).Any() Then
    Me.RemoveAt(index)
End If