« さようなら、ByVal | トップページ | Visual Studio Express 2012のデスクトップアプリケーション »

2011年5月15日 (日)

Split考

■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)

|

« さようなら、ByVal | トップページ | Visual Studio Express 2012のデスクトップアプリケーション »

Visual Basic」カテゴリの記事

コメント

あのう・・・ゲームを作成しようとしてるのですが・・・・画面を切り替える方法が分かりません・・・・・後乗ってなかったのですが・・・・詳しいアルゴリズム事を教えてくれないでしょうか・・・初めて・・・3日目で・・・・何が何だがわからないのです・・・

投稿: 腹黒猫 | 2011年6月20日 (月) 19時09分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/197542/51674710

この記事へのトラックバック一覧です: Split考:

« さようなら、ByVal | トップページ | Visual Studio Express 2012のデスクトップアプリケーション »