VB.NET Generics and System.Action delegate

A customer indicated that they were having some problems with Generics in VB.NET and using "foreach" on it.  After a couple of emails back and forth, I realized they wanted to see how to use the ForEach method on a List or Array.  One way to use iteration is to use the "For Each" syntax, as shown in the "iterate1" method below.  .NET 2.0 adds the System.Action generic delegate, which is implemented in the List and Array types with a ".ForEach" member method.  This use is shown in the "iterate2" method below.

 Module Module1

    Sub Main()
        Dim l As DemoList(Of String) = New DemoList(Of String)

        l.Add("foo")
        l.Add("bar")
        l.Add("baz")

        iterate1(l)
        iterate2(l)

    End Sub

    Sub iterate1(ByVal list As DemoList(Of String))
        Dim s As String
        For Each s In list
            list.DisplayUser(s)
        Next
    End Sub

    Sub iterate2(ByVal list As DemoList(Of String))
        list.ForEach(New Action(Of String)(AddressOf list.DisplayUser))
    End Sub

End Module

Public Class DemoList(Of T)
    Inherits List(Of T)

    Sub DisplayUser(ByVal val As String)
        Console.Write(" [- ")
        Console.Write(val)
        Console.WriteLine(" -] ")
    End Sub

End Class

This is a very cool capability that allows you to write tighter, more compact code while more easily leveraging existing code.

Jon - this is TWICE within the past week that I am coding VB.NET.