Friday, December 08, 2006

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

.NET | ASP.NET | VB.NET | NUnit
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):