■2つのSplit
文字列を区切ってくれる便利なSplitメソッドには実は2種類あって、1つがStrings.Split, もう1つがString.Splitです。(紛らわしいですがスペル的にはStringが複数形か単数形かの違いです。)
VBではStringsモジュールは省略可能なので、Strings.Splitを使っている人は普段は単にSplitと書いていて、Stringsモジュールを使っていることを意識していないことと思います。
それぞれの例
Strings.Splitの例
Dim value As String = "A,B,C"
Dim items() As String = Split(value, ",")
String.Splitメソッドの例
Dim value As String = "A,B,C"
Dim items() As String = value.Split(",")
■それぞれの違い
で、このどちらを使うかですが、昔何か面倒なことがあって私はずっとStrings.Splitの方を使っています。
ところが時が経つにつれて「何か面倒なこと」の内容を忘れてしまい、最近は「何でこっちがいいんだったろうか?」などと思いながらプログラムする日々が続いていました。
それを久しぶりに思い出したのでブログに書いておきます。知っている人にはつまらない話だと思います。
実はString.Splitはそのままでは区切り文字を1文字しか指定できないのに対し、Strings.Splitの方は何文字でも指定でき、区切り文字が2文字以上の時の書き方に差が出るのです。
どういうことかというと、
まず、Strings.Splitで区切り文字が2文字の場合、
Dim value As String = "AXYBXYC"
Dim items() As String = Split(value, "XY")
これは結果は "A", "B", "C"になります。
ところが、
同じことをそのままString.Splitで書くと、
Dim value As String = "AXYBXYC"
Dim items() As String = value.Split("XY")
これの結果は "A", "YB", "YC"になります。
String.Splitの方でこのような書き方をすると先頭の1文字だけ(上の例だと"X"だけ)を区切り文字として扱い、2文字目以降は無視されるのです。
■違いの理由
これは、上記のString.Splitの第1引数はChar型であって、String型でないことによります。"XY"はString型なので、上のような呼び出しを行うとChar型に自動的に変換されます。ところがChar型は1文字しか表せない方なので"X"だけが採用されるのです。
String.Splitを使って複数文字の区切り文字を扱いたい場合、文字列型ではなく、文字列型の配列にするとうまくいきます。
次のように書きます。
Dim value As String = "AXYBXYC"
Dim items() As String = value.Split({"XY"}, StringSplitOptions.None)
多分、これが面倒で統一的な書き方ができるStrings.Splitを私は使い続けていたのでしょう。
なお、Option Strict Onの状態ではvalue.Split("XY")はそもそもエラーになって実行できません。
■補足
ついでに念のため補足。Option Strict Onの状態だとこれもエラーにされます。
Dim items() As String = value.Split(",")
これを解決する一番簡単な方法は次のように書くことです。
Dim items() As String= value.Split(","c)
最近のコメント