DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

C#でSplit関数の代わりになるものは?

注意:ここでは、.NET Framework 1.1以前について説明しています。.NET Framework 2.0からはStringクラスのSplitメソッドに文字列も指定できるようになりましたので、この記事の方法を使う必要はありません。

StringクラスのSplitメソッドは区切り文字としてChar型でしか指定できないため、文字列で区切り文字を指定できるVBのSplit関数とは大きく異なります。ではVBのSplit関数のように区切り文字を文字列(String型)で指定できるようにするにはどうすればよいのでしょうか?

これにはMicrosoft.VisualBasic.StringsクラスのSplitメソッドを使う方法と、Regexクラス(System.Text.RegularExpression名前空間)のSplitメソッドを使う方法が考えられます。しかしこれらはかなり処理速度が遅いです。このような方法を使わずに、分割したい文字列内の区切り文字(列)をいったん適当な1文字(分割したい文字列内の分割したくない位置に絶対現れることのない文字)に置換した後、StringクラスのSplitメソッドにより分割した方が圧倒的に速いケースも多いようです。

次のサンプルではRegex.Split、VisualBasic.Strings.Split、string.Splitそれぞれのメソッドを使ってString型データを改行文字列("\r\n")で分割したときにかかった時間を計測しています。

C#
コードを隠すコードを選択
//いろいろな方法でstring型データを改行文字列("\r\n")で分割し
//その時間を計る
//テキストファイルをstrTextに読み込む
string strFileName = "REDIST.TXT";
System.IO.FileStream fs = new System.IO.FileStream(strFileName,
    System.IO.FileMode.Open);
System.IO.StreamReader sr = new System.IO.StreamReader(fs, 
    System.Text.Encoding.GetEncoding(932));
string strText = sr.ReadToEnd();
sr.Close();

int t1, t2, t3;
string [] s1, s2, s3;

//Regex.Splitで分割する
t1 = System.Environment.TickCount;
s1 = System.Text.RegularExpressions.Regex.Split(strText, "\r\n");
t1 = System.Environment.TickCount - t1;

//VisualBasic.Strings.Splitで分割する
t2 = System.Environment.TickCount;
s2 = Microsoft.VisualBasic.Strings.Split(strText, "\r\n", -1,
    Microsoft.VisualBasic.CompareMethod.Binary);
t2 = System.Environment.TickCount - t2;

//string.Splitで分割する
t3 = System.Environment.TickCount;
s3 = strText.Replace("\r\n", "\n").Split('\n');
t3 = System.Environment.TickCount - t3;

//結果を表示
Console.WriteLine("Regex.Split: {0}", t1);
Console.WriteLine("VisualBasic.Strings.Split: {0}", t2);
Console.WriteLine("string.Split: {0}", t3);
Console.WriteLine("Lines Count: {0}", s3.Length);

//表示例
//Regex.Split: 521
//VisualBasic.Strings.Split: 1452
//string.Split: 181

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。