2010-07-02 25 views
0

我有兩個陣列表,我想有一個新的陣列表只有不常見的項目。這是獲得兩個數組列表的區別的好方法嗎?

這是「最好的」還是至少體面的做法呢?

Public Function diffLists(ByRef first, ByRef second As Collection) As ArrayList 
    Dim retval As New ArrayList() 
    For Each element In first 
     If Not second.Contains(element) Then 
      retval.Add(element) 
     End If 
    Next 
    retval.TrimToSize() 
    Return retval 
End Function 

TIA

回答

1

這不是一個好辦法,因爲它只是讓你從第一個列表中沒有的第二個未元素不在兩個列表中(我明白你的問題是)元素。

無論哪種方式,最好的方法是使用Linq。如果你想要一個更好的方式做自己在做什麼,你可以使用Except方法,像這樣

first.Except(second) 

但是,如果你真的想在兩者之間的區別,你需要得到的一個Union兩個列表(這也將過濾出重複),然後excludeboth中的元素。

first.Union(second) 
    .Except(first.Intersect(second)); 

這種方法還具有額外的好處,說明你想做什麼(意圖)而不是如何處理任務(具體實現)。

0

我對VB並不熟悉,但總的來說,做到這一點的「最佳」方式是對兩個數組進行排序,然後並排比較元素,同時丟棄相同的元素。

在僞代碼:

Sort(A) 
Sort(B) 
I = 0, J = 0, K = Min(A.Length, B.Length) 
While I < K And J < K 
    If A[I] == B[J] 
    I++ 
    J++ 
    Else If A[I] < B[J] 
    Add A[I] to resultant list 
    I++ 
    Else // B[J] must be < A[I] 
    Add B[J] to resultant list 
    J++ 
    End If 
End While 
If I < A.Length 
    Add remaining elements of A to resultant list 
Else If J < B.Length 
    Add remaining elements of B to resultant list 
End If 
+0

如果你能保證列表中的元素是唯一的(列表是一組),有一個與該套組合成一個列表,排序的元素和拋出一個更簡單的方法那裏有兩個。 – R0MANARMY 2010-07-02 21:09:16