我已經寫了兩個將空白分隔的整數字符串轉換爲int數組的函數。所述第一函數使用Substring
,然後應用System.Int32.Parse
到串轉換爲int
值:更快地解析.NET上的數字
let intsOfString (s: string) =
let ints = ResizeArray()
let rec inside i j =
if j = s.Length then
ints.Add(s.Substring(i, j-i) |> System.Int32.Parse)
else
let c = s.[j]
if '0' <= c && c <= '9' then
inside i (j+1)
else
ints.Add(s.Substring(i, j-i) |> System.Int32.Parse)
outside (j+1)
and outside i =
if i < s.Length then
let c = s.[i]
if '0' <= c && c <= '9' then
inside i (i+1)
else
outside (i+1)
outside 0
ints.ToArray()
第二功能橫穿就地累積整數字符串的字符而不創建臨時子:
let intsOfString (s: string) =
let ints = ResizeArray()
let rec inside n i =
if i = s.Length then
ints.Add n
else
let c = s.[i]
if '0' <= c && c <= '9' then
inside (10*n + int c - 48) (i+1)
else
ints.Add n
outside(i+1)
and outside i =
if i < s.Length then
let c = s.[i]
if '0' <= c && c <= '9' then
inside (int c - 48) (i+1)
else
outside (i+1)
outside 0
ints.ToArray()
空格分隔整數的基準測試1到1,000,000,第一個版本需要1.5s,而第二個版本需要0.3s。
解析這些值可能會影響性能,所以通過使用臨時子字符串在表上留下5倍的性能可能是不理想的。解析整數很簡單,但解析其他值(如浮點數,小數點和日期)則相當困難。
那麼,是否有內置函數直接從字符串中的子字符串解析(即使用給定的字符串的開始和長度)以避免生成臨時字符串?如果沒有,是否有任何庫提供了有效的功能來執行此操作?
你有沒有嘗試過使用正則表達式而不是使用Substring?已編譯的正則表達式可能比字符串操作快得多 –
@PanagiotisKanavos您能解釋一下如何使用正則表達式將字符串解析爲一個整數數組? –
我最近有一個類似的問題,當我搜索時找不到任何東西,必須自己寫小數解析代碼。它不像你想象的那麼困難,因爲Decimal類有一個構造函數,它需要一個縮放因子,所以你可以做和整數解析幾乎一樣的東西,並且跟蹤小數點的位置。日期也不太困難,但是在兩種情況下,我都嚴格控制了格式。我不想寫一般的解析代碼... – MrKWatkins