文字列への「挿入」処理
C#で文字列を構築する際、既存の文字列(例: "File.log")の特定の位置(例: . の直前)に、別の文字列(例: "_backup")を差し込みたい場合があります。
+演算子やstring.Format、Substringを組み合わせてこの操作を行うことも可能ですが、コードが複雑になりがちです。
stringクラスには、このような「挿入」操作を1行で簡単に行うためのInsertメソッドが用意されています。
string.Insert メソッドの基本
string.Insertメソッドは、2つの引数を取ります。
基本構文: string.Insert(int startIndex, string value)
startIndex: 挿入を開始する位置のインデックス(0から始まります)。このインデックスの直前にvalueが挿入されます。value: 挿入する文字列。
コード例:基本的な挿入
例えば、"Report.pdf"という文字列の先頭(インデックス 0)に、日付プレフィックス "2025_" を挿入する例です。
using System;
public class InsertBasicExample
{
public static void Main()
{
string originalFile = "Report.pdf";
string prefix = "2025_";
// インデックス 0 (先頭) に prefix を挿入
string newFile = originalFile.Insert(0, prefix);
Console.WriteLine($"元の文字列: {originalFile}");
Console.WriteLine($"挿入後の文字列: {newFile}");
}
}
出力結果:
元の文字列: Report.pdf
挿入後の文字列: 2025_Report.pdf
重要な注意点:文字列の不変性(Immutable)
string.Insertメソッド(およびReplace, Removeなど)を使用する際、C#のstring型が**不変(Immutable)**であるという特性を理解しておく必要があります。
Insertメソッドは、元の文字列を直接変更しません。 代わりに、指定された位置に文字列が挿入された「新しい文字列」を生成して返します。
失敗する例(元の文字列は変わらない)
string message = "Hello World!";
message.Insert(5, ", C#"); // 挿入を実行するが、結果を捨てている
// message 変数自体は何も変わっていない
Console.WriteLine(message); // "Hello World!" がそのまま出力される
正しい例(新しい変数に結果を代入)
Insertメソッドが返してきた新しい文字列を、別の変数(または元の変数自身)に代入し直す必要があります。
string message = "Hello World!";
// 戻り値(新しい文字列)を受け取る
string newMessage = message.Insert(5, ", C#");
Console.WriteLine(newMessage); // "Hello, C# World!" が出力される
応用:IndexOf と Insert の組み合わせ
挿入位置(startIndex)を固定値で指定するのではなく、IndexOf(文字検索)と組み合わせることで、より動的な挿入処理が可能になります。
コード例:IndexOf との組み合わせ
ファイル名 "data.log" の拡張子(.)の直前に、"_backup" という文字列を挿入する例です。
using System;
public class InsertWithIndexOfExample
{
public static void Main()
{
string originalPath = "data.log";
string suffixToInsert = "_backup";
// 1. 挿入位置の基準となる '.' のインデックスを検索
int extensionIndex = originalPath.IndexOf('.');
// 2. '.' が見つかった場合 (-1 ではない場合)
if (extensionIndex != -1)
{
// '.' のインデックス (4) に "_backup" を挿入
string newPath = originalPath.Insert(extensionIndex, suffixToInsert);
Console.WriteLine($"元のパス: {originalPath}");
Console.WriteLine($"挿入後のパス: {newPath}");
}
else
{
Console.WriteLine("拡張子の区切り文字 '.' が見つかりませんでした。");
}
}
}
出力結果:
元のパス: data.log
挿入後のパス: data_backup.log
注意点:ArgumentOutOfRangeException
InsertメソッドのstartIndexに、文字列の有効な範囲(0からLengthまで)を超えるインデックスを指定した場合、プログラムはArgumentOutOfRangeExceptionという実行時エラーをスローして停止します。
IndexOfの結果が-1(見つからなかった)の場合に、その-1をInsertに渡すとこの例外が発生するため、if (index != -1)のようなチェックが重要です。
まとめ
string.Insert(int startIndex, string value)は、C#で文字列の指定位置に別の文字列を差し込むための標準的なメソッドです。
startIndexで指定した位置の直前に文字列が挿入されます。- C#の文字列は不変であるため、
Insertは元の文字列を変更せず、挿入済みの新しい文字列を返します。 IndexOfと組み合わせることで、特定の目印(区切り文字)を基準にした挿入が可能です。
