Reputation: 2033
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
Upvotes: 1
Views: 1172
Reputation: 2158
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
Upvotes: 1
Reputation: 2033
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
Upvotes: 1
Reputation: 1500535
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 :)
Upvotes: 3