views:

436

answers:

3

Hello,

I am trying to work my way through the NerdDinner tutorial - and as an exercise I'm converting it to VB as I go. I'm not very far in and after having gotten past the C# Yield statement I'm stuck on Shared VB Array Initialisors.

static IDictionary<string, Regex> countryRegex =
new Dictionary<string, Regex>() {
{ "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")},
{ "UK", new
Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-
9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")},
{ "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-
9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-
\\s]{10}$)")},

Can anyone please help me write this in VB?

Public Shared countryRegex As IDictionary(Of String, Regex) = New Dictionary(Of String, Regex)() {("USA", New Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$"))}

This code has an error as it does not accept the String and the Regex as an item for the array.

Thanks

+3  A: 

I don't believe that VB9 supports collection initializers, although I think it will be in VB10.

The simplest option is probably to write a shared method which creates and then returns the dictionary, and call that shared message from the variable initializer. So in C#, it would be:

static IDictionary<string, Regex> countryRegex = CreateCountryRegexDictionary();

static IDictionary<strnig, Regex CreateCountryRegexDictionary()
{
    Dictionary<string, Regex>() ret = new Dictionary<string, Regex>();
    ret["USA"] = new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$");
    // etc
    return ret;
}

Hopefully you'll find that easier to translate into VB :)

Jon Skeet
Thanks Jon, I was thinking along those lines although I hadn't got as far as putting it all inside a Shared method - I was just considering adding a constructor to the class! My bad! Cheers
David A Gibson
+1  A: 

My VB conversion for completeness:

Public Shared Function GetIDictionary() As IDictionary(Of String, Regex)
Dim countryRegex As IDictionary(Of String, Regex) = New Dictionary(Of String, Regex)()
countryRegex("USA") = New Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")
countryRegex("UK") = New Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")
countryRegex("Netherlands") = New Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")
Return countryRegex
End Function

Cheers again Jon

David A Gibson
+1  A: 

In case its any use, here is my completed VB.Net NerdDinner PhoneValidator incl UK and Ireland Mobile Phones

Public Class PhoneValidator

    Private Shared Function GetIDictionary() As IDictionary(Of String, Regex)
        Dim countryRegex As IDictionary(Of String, Regex) = New Dictionary(Of String, Regex)()
        countryRegex("USA") = New Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")
        countryRegex("UK") = New Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")
        countryRegex("Netherlands") = New Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")
        countryRegex("Ireland") = New Regex("^((07|00447|\+447)\d{9}|(08|003538|\+3538)\d{8,9})$")
        '
        Return countryRegex
    End Function

    Public Shared Function IsValidNumber(ByVal phoneNumber As String, ByVal country As String) As Boolean

        If country IsNot Nothing AndAlso GetIDictionary.ContainsKey(country) Then
            Return GetIDictionary(country).IsMatch(phoneNumber)
        Else
            Return False
        End If
    End Function

    Public ReadOnly Property Countries() As IEnumerable(Of String)
        Get
            Return GetIDictionary.Keys
        End Get
    End Property

End Class
Leo Moore
Cheers Leo, I'm sure it will be useful!
David A Gibson