2013-07-22 44 views
0

如何檢測兩個給定列表的項是否相等?VB.NET:檢查列表項是否相等並具有相同的數

Dim list1 As New List(Of Integer) 
list1.AddRange({1, 2, 3}) 

Dim list2 As New List(Of Integer) 
list2.AddRange({3, 2, 1}) 

如果我使用他們比較SequenceEqual,我得到False,因爲項目的順序是不一樣的。我怎麼能比較他們沒有排序他們第一,雖然?

編輯:請注意,這應該尊重重複,例如{1, 2, 3, 1}是不相同的{1, 2, 3}(項目1在第一個列表中發生兩次)。

+0

循環遍歷列表中的一個,並檢查其他列表中包含的元素。同時檢查一下列表的長度是否相同。 –

+0

爲什麼「先不分類」?聽起來像是一個不錯的選擇。 – SysDragon

+0

@SysDragon:聽起來不錯,但是,如果你想在訂單中保留訂單呢?但是,這導致我最終實現,但:-) – jor

回答

0
<System.Runtime.CompilerServices.Extension()> _ 
Function AreItemsEqual(Of T)(col1 As IEnumerable(Of T), col2 As IEnumerable(Of T)) As Boolean 
    ' performance checks 
    If col1 Is col2 Then Return True 
    If col1 Is Nothing OrElse col2 Is Nothing Then Return False 
    If col1.Count <> col2.Count Then Return False 
    ' compare their elements 
    Dim o1 As IEnumerable(Of T) = col1.OrderBy(Function(i) i) 
    Dim o2 As IEnumerable(Of T) = col2.OrderBy(Function(i) i) 
    Return o1.SequenceEqual(o2) 
End Function 

用法:

If list1.AreItemsEqual(list2) Then 
    ... 
+0

與我的相似方法: http://stackoverflow.com/a/17787628/284240但是,如果集合很大,效率不高。 –

+0

當然,但更高性能和更緊湊:-) – jor

+0

SequenceEqual與我的For循環相同,只要條件爲False,它們都會中斷。然而,兩者都是不夠的,因爲這兩個集合都必須複製到一個新的集合中,並且這兩個集合都需要完全排序。 –

4

如果你想知道,如果兩個列表包含相同的項目,你可以使用Enumerable.Except

Dim bothContainSameItems As Boolean 
If list1.Count > list2.Count Then 
    bothContainSameItems = Not list1.Except(list2).Any() 
Else 
    bothContainSameItems = Not list2.Except(list1).Any() 
End If 

,或者與HashSet(Of T)幫助:

Dim l1Set = New HashSet(Of Integer)(list1) 
Dim l2Set = New HashSet(Of Integer)(list2) 
bothContainSameItems = l1Set.SetEquals(l2Set) 

注意,這兩種方法會忽略重複。因此,他們將返回equal爲:

list1.AddRange({1, 1, 2, 3}) 
list2.AddRange({3, 2, 1, 3}) 

這裏是一個可能的方式也檢查所有數字有兩個列表相同的計數:

bothContainSameItems = list1.Count = list2.Count 
If bothContainSameItems Then 
    Dim l1Ordered = list1.OrderBy(Function(i) i).ToList() 
    Dim l2Ordered = list2.OrderBy(Function(i) i).ToList() 
    For i As Int32 = 0 To l1Ordered.Count - 1 
     If l1Ordered(i) <> l2Ordered(i) Then 
      bothContainSameItems = False 
      Exit For 
     End If 
    Next 
End If 
+2

反例:'list1 = {1,1,2,3}','list2 = {1,2,3}'。 –

+0

@KonradRudolph:我已經添加了一個類似的例子。這取決於他是否想要比較集合的要求。 –

0

還與

Dim list1 As New List(Of Integer) 
list1.AddRange({1, 2, 3}) 

Dim list2 As New List(Of Integer) 
list2.AddRange({3, 2, 1}) 

Dim list3 = list1.Union(list2) 
if list3.OrderBy(Function(i) i).SequenceEqual(list1.OrderBy(Function(i) i)) then 
    Console.WriteLine("Equal") 
else 
    Console.WriteLine("Not Equal") 
end if 

IEnumerable.Union工作

返回值:包含來自兩個輸入序列的元素的IEnumerable(Of T), 不包含重複項。

+0

這改變了第一個列表並且不考慮重複。 – jor

+0

@Johannes我已經說過這個事實,工會改變了名單。當文檔明確表示相反時,您爲什麼認爲這不會重複考慮?至少在downvoting之前檢查 – Steve

+0

文檔清楚地說明了它。檢查這個例子:'{1,2,3}'和'{1,2,3,1}',反之亦然。 – jor

相關問題