Fun with Generics in VB

I had so much fun with my little generics experiment that I thought I would try the same code in VB.

A couple of interesting notes:

  1. Generics are fully supported by VB… I found zero language\compiler issues with this little example!
  2. Notice I didn’t find a way to do type aliasing in VB, but I might just be missing it, so you see the (slightly ugly) nested generics more often in the VB code
    List(Of KeyValuePair(Of String, Integer)) rather than List(Of NameCount)
  3. VB doesn’t yet support the functional members so I used the more traditional interface based callback. It is good that we offer both on this class. Using the delegate based one with out the language support would have been really ugly. Do you like the functional way or the interface way better?
  4. The Comparer base class was fun to use -- it really made it easy. I did find out that we are making a change to make Equals not abstract. It will be a virtual member with the exact same implementation I show below. I think this is goodness as it allows folks to customize it for performance sensitive scenarios but doesn’t force everyone to do it.

   Sub Main()

        Dim tally As New Dictionary(Of String, Integer)

        Dim entries As List(Of Uri)

        entries = GetEntryUris(DateTime.Parse("2/01/2004"), DateTime.Now)

        For Each entry As Uri In entries

            For Each name As String In GetComments(entry)

                If (tally.ContainsKey(name)) Then

                    tally(name) = tally(name) + 1

                Else

                    tally.Add(name, 1)

                End If

            Next

        Next

        Dim l As New List(Of KeyValuePair(Of String, Integer))(tally)

        l.Sort(New KeyValuePairComparer())

        For Each k As KeyValuePair(Of String, Integer) In l

            Console.WriteLine("{0}={1}", k.Key, k.Value)

        Next

        Console.ReadLine()

    End Sub

End Module

Class KeyValuePairComparer

    Inherits Comparer(Of KeyValuePair(Of String, Integer))

    Public Overrides Function Compare(ByVal x As KeyValuePair(Of String, Integer), ByVal y As KeyValuePair(Of String, Integer)) As Integer

        Return x.Value.CompareTo(y.Value)

    End Function

    Public Overloads Overrides Function Equals(ByVal x As KeyValuePair(Of String, Integer), ByVal y As KeyValuePair(Of String, Integer)) As Boolean

        Return Compare(x, y) = 0

    End Function

End Class