Split的弔詭

Split有一些令人覺得很奇妙的特質,這篇文源自於MSDN論壇上的一個發問 :【請教】關於 SPlit 跟 陣列長度 ,就寫個小文章來解釋一下。

      Split有一些令人覺得很奇妙的特質,這篇文源自於MSDN論壇上的一個發問 :【請教】關於 SPlit 跟 陣列長度 ,就寫個小文章來解釋一下。

      在MSDN文件庫上對於Split方法有一個備註 ( http://msdn.microsoft.com/zh-tw/library/c1bs0eda.aspx ) 有以下一段話:separator 的每個項目各定義一個分隔字元。如果兩個分隔符號為相鄰,或是在此執行個體的開頭或結尾找到一個分隔符號,則對應的陣列元素會包含 Empty

    不過這句話聽起來還挺模糊的,但在 Microsoft.VisualBasic命名空間中的Strings.Split 方法 中有一個更明白的說法: 當 Split 函式在一個資料列中遇到兩個分隔符號,或是在字串開頭或結尾位置遇到一個分隔符號時,都會將這些分符號解譯為空白字串 ("")。例如,Split("xx", "x") 會傳回包含三個空白字串的陣列:一個來自字串開頭與第一個 "x" 之間、一個來自兩個 "x" 字串之間,而第三個則是來自最後一個 "x" 與字串結尾之間。

     所以論壇的這個問題我先將空白用x替代則是 xx4419xxxx1928439716,此時也用x來當分隔字元,為求簡單明瞭,我們為每個x加上編號依序為x0~x5,

     (1) 根據開頭原則x0會被解譯為一個String.Empty

     (2) 沒有x位於結尾,所以結尾原則用不上

     (3) 根據相鄰原則,x0與x1間會產生一個String.Empty;x2與x3之間會產生一個String.Empty;x3與x4之間會產生一個String.Empty;x4與x5之間會產生一個String.Empty

     (4) 4419與1928439716兩個字串會被分割

     所以解答就是

     String.Empty (因為x0是開頭)

     String.Empty (x0,x1相鄰)

     4419

     String.Empty (x2,x3相鄰)

     String.empty (x3,x4相鄰)

     String.Empty (x4,x5相鄰)

     1928439716

這個雖然很容易把人弄迷糊,但其實只要仔細思考MSDN文件所講的重點再加上用紙筆模擬就可以豁然開朗了。