Free code that determines if 2 lists (any objects that implement the IList interface, such as Array, ArrayList, ListBox, etc.) contain the same objects or value types (NOTE: as per value types, remember int != long, etc.)
Notes: Dupes/Frequency are not considered (e.g.: 1,1,1,2,2 and 1,2 will be seen as equivalent lists)
Public Shared Function ListsContainEqualValues(ByVal list1 As IList, ByVal list2 As IList) As Boolean
Dim bContainsEqualValues As Boolean = False
bContainsEqualValues = True
For Each obj1 As Object In list1
If Not list2.Contains(obj1) Then
bContainsEqualValues = False
End If
Next
For Each obj2 As Object In list2
If Not list1.Contains(obj2) Then
bContainsEqualValues = False
End If
Next
Return bContainsEqualValues
End Function
To illustrate its definition of equality, here is an example group of NUnit tests (assumes function is placed in a "Utility" class):
Imports NUnit.Framework
Imports System.Collections
<TestFixture()> Public Class TestUtility
Dim _al1 As ArrayList
Dim _al2 As ArrayList
Dim _int2 As Integer = 2
Dim _long2 As Long = 2
Dim _obj1 As New Order
Dim _obj2 As New Order
Dim _obj3 As Order = _obj1
<Test(), Category("ListsContainEqualValues")> Public Sub InOrderSameCountEqualValues()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(1)
_al1.Add(_long2)
_al1.Add(_obj1)
_al2.Add(1)
_al2.Add(_long2)
_al2.Add(_obj3)
Assert.IsTrue(1.Equals(1))
Assert.IsTrue(_long2.Equals(_long2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsTrue(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
<Test(), Category("ListsContainEqualValues")> Public Sub NotInOrderSameCountEqualValues()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(_obj1)
_al1.Add(_long2)
_al1.Add(1)
_al2.Add(1)
_al2.Add(_long2)
_al2.Add(_obj3)
Assert.IsTrue(1.Equals(1))
Assert.IsTrue(_long2.Equals(_long2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsTrue(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
<Test(), Category("ListsContainEqualValues")> Public Sub NotInOrderSameCountNotEqualValues()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(_obj1)
_al1.Add(_long2)
_al1.Add(3)
_al2.Add(1)
_al2.Add(_long2)
_al2.Add(_obj3)
Assert.IsFalse(3.Equals(1))
Assert.IsTrue(_long2.Equals(_long2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsFalse(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
<Test(), Category("ListsContainEqualValues")> Public Sub NotInOrderNotSameCountEqualValuesWithExtra()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(_obj1)
_al1.Add(_long2)
_al1.Add(1)
_al1.Add(3)
_al2.Add(1)
_al2.Add(_long2)
_al2.Add(_obj3)
Assert.IsTrue(1.Equals(1))
Assert.IsTrue(_long2.Equals(_long2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsFalse(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
<Test(), Category("ListsContainEqualValues")> Public Sub NotInOrderNotSameCountEqualValuesWithDupes()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(_obj1)
_al1.Add(1)
_al1.Add(_long2)
_al1.Add(1)
_al2.Add(1)
_al2.Add(_long2)
_al2.Add(_obj3)
Assert.IsTrue(1.Equals(1))
Assert.IsTrue(_long2.Equals(_long2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsTrue(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
<Test(), Category("ListsContainEqualValues")> Public Sub NotInOrderSameCountEqualValuesDiffNumerics()
_al1 = New ArrayList
_al2 = New ArrayList
_al1.Add(_obj1)
_al1.Add(_long2)
_al1.Add(1)
_al2.Add(1)
_al2.Add(_int2)
_al2.Add(_obj3)
Assert.IsTrue(1.Equals(1))
Assert.IsFalse(_long2.Equals(_int2))
Assert.IsTrue(_obj1.Equals(_obj3))
Assert.IsFalse(Utility.ListsContainEqualValues(_al1, _al2))
End Sub
End Class