2014-07-16 2 views
0

정수 컬렉션 항목이 포함 된 모음이 있습니다. 내가하고 싶은 일은 최상위 레벨 목록에서 다른 항목의 확장 된 하위 집합 인 항목을 제거하는 것입니다.Linq 목록 부분 집합 제거

은 예로서 다음의 목록 참조 :

항목 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 : I 코드를 실행할 때, 42, 51, 1

항목 4를 제외한 모든 항목에서 제거되어야 항목 4의 확장이 있기 때문에 목록.

아래 코드는 작동하며 작업 corr 나는 예상보다 조금 더 오래 걸리고있다. 컬렉션에 많은 항목이 있습니다.

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 

답변