2016-03-04 27 views
0

我有以下代碼(對不起,VB!),我正在尋找避免必須做一個For Each循環來初始化String(即「10,25,50」)收集使用Int32.TryParse任何方式來初始化使用Int32.TryParse列表(整數)

有沒有辦法做到這一點?像Function(x) lambda那種只在String集合中通過Int32.TryParse時才添加物品的東西?

Dim options = ConfigHelper.GetContentValue("NavigationPaging", "PageSizeOptions").Split(CChar(",")) 
Dim optionsList As List(Of Integer) = New List(Of Integer)() 'Initialise the collection here to avoid the For Each 
For Each item As String In options 
    Dim i As Integer 
    If Int32.TryParse(item, i) Then 
     optionsList.Add(i) 
    End If 
Next 

謝謝。

+0

什麼選擇什麼樣子的? 「 – Plutonix

+0

」10,25,50「我會在這個問題上加上。 –

+0

TryParse是爲了確保沒有duff值拋出異常。有很多人可以修改原始字符串。 –

回答

1

我發現你的循環非常可讀。但是,如果你想使用LINQ你可以使用此查詢:

Dim allIntegers = From opt In options 
        Let intOpt = opt.TryGetInt32() 
        Where intOpt.HasValue 
        Select intOpt.Value 
Dim optionsList As List(Of Integer) = allIntegers.ToList() 

我使用它派上用場的LINQ查詢此擴展方法:

Module StringExtensions 
    <Extension()> 
    Public Function TryGetInt32(Str As String) As Nullable(Of Int32) 
     If Str Is Nothing Then Return Nothing 
     Dim num As Int32 
     If Int32.TryParse(Str, num) Then Return num 
     Return Nothing 
    End Function 
End Module 

這種方法is much better比使用本地變量爲Int32.TryParse存儲。

+0

我喜歡這個作爲向String添加TryGetInt32擴展的更深層解決方案。代碼被深埋,所以可讀性不是問題,但是我們的配置系統有一個限制,這意味着我們必須做很多這種事情,並且擴展方法可以幫助那裏。感謝你的回答!我沒有被封鎖,但只是相信有更好的辦法! –

1

你的循環是清晰可讀,但這裏是另一種方式:

Dim options = {"10", "25", "50", "foo"} 
Dim optionVals = Array.ConvertAll(Of String, Int32)(options, Function(c) 
                   Dim tmp As Int32 = 0 
                   Int32.TryParse(c, tmp) 
                   Return tmp 
                  End Function).ToList() 

初始化tmp到任何默認值要使用的錯誤值(-1,Int32.MinValue等)

另一種方法是調用解析器功能:

optionVals = Array.ConvertAll(Of String, Int32)(options, Function(c) IntParser(c)).ToList() 

Private Function IntParser(s As String) As Int32 
    Dim n As Int32 

    If Int32.TryParse(s, n) Then 
     Return n 
    Else 
     Return 0 
    End If 
End Function