読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

フォーマットを指定して文字列作成【C#】


このエントリーをはてなブックマークに追加

はじめに

例えば、以下のように画像に名前が付いていた時、

monster_1_1_1
monster_3_2_5

数字部分だけ変えて画像名の文字列を作りたいと言った場合のやり方です。


連結演算子

まずは連結演算子を使ったやり方です。

const string MONSTER_IMAGE_NAME_PREVIOUS = "monster";

int monsterTypeNo   = 3;
int monstertColorNo = 2;
int monsterImageNo  = 5;

string imageName = MONSTER_IMAGE_NAME_PREVIOUS
                   + "_" + monsterTypeNo.ToString ()
                   + "_" + monstertColorNo.ToString () 
                   + "_" + monsterImageNo.ToString ();

Debug.Log (imageName);

monster_3_2_5

画像名の前半部分を定数で宣言しておき、数字部分を連結していくという方法です。

この方法でも実現可能ですが、monster_1_1_1_afterのように数字の後にさらに文字列がある場合などは

さらに連結が必要になり、コードが長くなりがちです。


String.Format

次にString.Formatを使ったやり方です。

const string MONSTER_IMAGE_NAME_FORMAT = "monster_{0}_{1}_{2}";

int monsterTypeNo   = 3;
int monstertColorNo = 2;
int monsterImageNo  = 5;

string imageName = string.Format (
  MONSTER_IMAGE_NAME_FORMAT, monsterTypeNo, monstertColorNo, monsterImageNo
);

Debug.Log (imageName);

monster_3_2_5


これは表題にある通り、文字列のフォーマットを定数で設定しておいて、

そのフォーマットの{0}や{1}といった変更される部分に数字を入れていくといった方法です。


StringBuilder. AppendFormat

最後にStringBuilder. AppendFormatを使ったやり方です。

using System.Text;

const string MONSTER_IMAGE_NAME_FORMAT = "monster_{0}_{1}_{2}";

int monsterTypeNo   = 3;
int monstertColorNo = 2;
int monsterImageNo  = 5;

StringBuilder builder = new StringBuilder ();
builder.AppendFormat(
  MONSTER_IMAGE_NAME_FORMAT, monsterTypeNo, monstertColorNo, monsterImageNo
);

string imageName = builder.ToString ();

Debug.Log (imageName);

monster_3_2_5


これもやり方としてはString.Formatと同じく変更される部分に数字を入れていくといった方法です。

ただ、using System.Text;を宣言しなくてはならないし、

stringとは別にStringBuilderを使わなきゃいけないのでちょっと面倒です。


おわりに

下記のサイトにあるように、場合によっては

連結演算子を使った方が処理時間が短い場合もあるので注意が必要です、

C# String Concat Programs」によると、複数の文字列を連結する時、連結演算子やConcatメソッドを使って一度に連結する方法が、String.FormatやStringBuilder.Appendメソッドを使った方法よりもパフォーマンスが良いということです。

文字列を連結する: .NET Tips: C#, VB.NET


とは言え、String.Formatを使った方が綺麗に書ける気がするので、

よっぽど頻繁または大量に実行にするのでなければ、処理速度の方は気にしなくていいと思います。