|
.NET TIPS 文字列を連結するには?デジタルアドバンテージ2003/05/23 |
![]() |
|
|
|
複数の文字列を1つの文字列に連結するには、C#では「+演算子」(Visual Basic .NETでは「&演算子」)を使用する。
using System; |
数値計算と同様に、文字列に対してもC#では「+=演算子」(Visual Basic .NETでは「&=演算子」)を使用することもできる。「ewf += fire;」は、「ewf = ewf + fire;」と記述するのと同じ意味で、これは文字列の末尾に別の文字列を追加する。
文字列に対するこれらの連結演算子は非常に便利だが、あまり高速ではないということを覚えておく必要がある。上記のような例ではまったく問題にはならないが、ループ内で文字列を連結しながら長い文字列を作り上げていくような場合には注意が必要だ。これは次のような簡単なコードで実感することができる。
|
|
| 10万個のアスタリスクからなる文字列を作成するC#のサンプル・プログラム(append1.cs) | |
このサンプル・プログラムは10万個のアスタリスクからなる文字列を作成するだけだが、筆者のPC(Pentium 4-1.7GHz、メモリ512Mbyte)では終了するまでに20秒近くかかった。
この処理が遅い最大の原因は、文字列の連結時(実際には、コンパイラは演算子による文字列連結をStringクラスのConcatメソッド呼び出しに置き換える)に毎回新たなメモリ領域が割り当てられるためだ。つまり、
str += "*";
では、まず「文字列strの長さ」+「文字列"*"の長さ」のメモリ領域を割り当て、そこに文字列strの内容と、文字列"*"をコピーする。そして、この領域が変数strの示す内容となる。
このような頻繁な文字列の連結は、次のStringBuilderクラスを利用すれば劇的に高速化することができる。
高速に文字列を連結するには?
StringBuilderクラス(System.Text名前空間)は、名前のとおり文字列を作り上げるためのクラスだ。このクラスを利用するには、まずそのインスタンスを作成する。
StringBuilder sb = new StringBuilder();
そしてAppendメソッドを使用して、文字列をどんどん追加(連結)することができる。
sb.Append("土と");
sb.Append("風と");
sb.Append("火と");
ちなみに、Appendメソッドは文字列追加後の自分のインスタンスを返すので、上の3行は次のように1行でも記述できる。
sb.Append("土と").Append("風と").Append("火と");
最終的にStringBuilderクラスのインスタンスから文字列を取り出すには、次のようにしてToStringメソッドを呼び出せばよい。
string ewf = sb.ToString();
さて、StringBuilderクラスを利用して先ほどのサンプル・プログラム(append1.cs)を書き直すと次のようになる。
|
|
| StringBuilderクラスを使って10万個のアスタリスクからなる文字列を作成するC#のサンプル・プログラム(append2.cs) | |
このプログラムはあまり速くない筆者のPCでも一瞬で終了する。これは、StringBuilderクラスでは文字列の追加に備えてあらかじめ大きめのメモリ領域を割り当てておき、Appendメソッドではその領域に文字列をコピーするだけだからだ(コストの大きいメモリ領域の確保が毎回実行されるわけではない)。
実際には、StringBuidlerクラスは初期化時に16byteの大きさのメモリ領域を割り当てる。そして文字列の追加によりメモリ領域が足りなくなると、そのメモリ領域を2倍の大きさに拡張する。このため上記のサンプル・プログラムでは、メモリ領域の割り当ては十数回しか発生しない。
最初に割り当てる領域のサイズはStringBuidlerクラスのコンストラクタで指定することができるため、コンストラクタ呼び出しを次のように記述しておけば、このサンプル・プログラムをもう少しだけ高速化することができる。
StringBuilder sb = new StringBuilder(100000);
なお、StringBuidlerクラスを使用した例は、「TIPS:ピクセルの色をHTMLカラーへ変換するには?」にも掲載しているので参考にしていただきたい。![]()
| カテゴリ:クラス・ライブラリ 処理対象:文字列 使用キーワード:連結演算子 使用ライブラリ:StringBuilderクラス(System.Text名前空間) 関連TIPS:ピクセルの色をHTMLカラーへ変換するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
ホワイトペーパー(TechTargetジャパン)
- LocalConnection APIと動的なスタイリング (2010/2/9)
Webページ上の複数のSilverlightアプリ間でメッセージ通信をする方法とは? コントロールの見た目を動的に設定する方法とは? - ASP.NET MVC 2:モデルの検証 (2010/2/8)
ASP.NET MVC 2で導入される入力検証機能を使った実装を紹介。シンプルな属性の追加によるエレガントな実装が可能となっている - ASP.NETによる3階層Webアプリ「ITブック」構築 (2010/2/5)
ちょっとした改造で、あなたのWebアプリは劇的に使いやすく、かっこよくなる。まずは元となるWebアプリを標準的手法で構築 - .NET TIPS - .NET開発のテクニックとヒント集 - (2010/2/4)
− カスタムMVCビューエンジンを利用するには?(活用編)
− フォーム全体へのドッキングでつまみを表示するには?
− リストボックスでTextBlockの文字列を折り返すには?
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |







