🦔

【C#プログラミング】String型の最初のx文字のみを特定の要素に書き換える方法

2024/11/18に公開2

はじめに

競技プログラミング中に必要が出てきたのでまとめました。
指定した文字列の最初の x 文字のみを 0 に書き換える方法は、C# の文字列操作を使うことで実現できます。以下にいくつかの方法を示します。

方法 1: Substring を使った方法

string input = "abcdefghij";
int x = 3; // 最初の3文字を "0" に書き換える

string result = new string('0', x) + input.Substring(x);
Console.WriteLine(result); // 出力: 000defghij

説明

  • new string('0', x)'0'x 回繰り返した文字列を生成。
  • input.Substring(x) で元の文字列の x 番目以降の部分を取得。
  • 両方を結合して結果を得る。

方法 2: StringBuilder を使った方法

using System.Text;

string input = "abcdefghij";
int x = 4; // 最初の4文字を "0" に書き換える

var sb = new StringBuilder(input);
for (int i = 0; i < x && i < sb.Length; i++)
{
    sb[i] = '0';
}
string result = sb.ToString();
Console.WriteLine(result); // 出力: 0000efghij

説明

  • StringBuilder を使って、文字列の特定の位置を効率的に変更。
  • ループで最初の x 文字を '0' に書き換え。

方法 3: Linq を使った方法

using System;
using System.Linq;

string input = "abcdefghij";
int x = 2; // 最初の2文字を "0" に書き換える

string result = string.Concat(input.Select((c, index) => index < x ? '0' : c));
Console.WriteLine(result); // 出力: 00cdefghij

説明

  • Select で各文字を処理し、index < x のとき '0' に置換。
  • string.Concat で文字列に変換。

方法 4: ToCharArray を使った方法

string input = "abcdefghij";
int x = 5; // 最初の5文字を "0" に書き換える

char[] charArray = input.ToCharArray();
for (int i = 0; i < x && i < charArray.Length; i++)
{
    charArray[i] = '0';
}
string result = new string(charArray);
Console.WriteLine(result); // 出力: 00000fghij

説明

  • 文字列を char の配列に変換 してから、最初の x 文字を書き換え。
  • new string(charArray) で配列を再び文字列に変換。

まとめ

  • 最短・簡潔: Substringnew string を使う方法(方法 1)。
  • パフォーマンス: 文字列の一部を書き換えるなら StringBuilder(方法 2)が効率的。
  • Linq を使った方法は読みやすいが、パフォーマンスは若干劣ります。

おすすめ・参考書籍

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)
https://amzn.to/3YFmdH5

Discussion

いぬいぬいぬいぬ

方法 1: Substring を使った方法

この方法は、C#8.0以降ならIndex/Rangeが使えますね。
インデックスと範囲を使用してデータの範囲を調べる - C# | Microsoft Learn

Substring() の代わりに Index/Range
- string result = new string('0', x) + input.Substring(x);
+ string result = new string('0', x) + input[x ..];

方法 4: ToCharArray を使った方法

この方法は ToCharArray のあとに Span<char> として扱う方法があります。

string FillStart(string input, int x)
{
	Span<char> charArray = input.ToCharArray();
	charArray[..x].Fill('0');
	return new(charArray);
}

var result2 = FillStart(input, x);

またここまでで上がっていない手法として string.Create<TState>() を使った手法があります。

var result3 = string.Create<string>(input.Length,input,(span, state)=>{
	span[..x].Fill('0');
	state[x..].AsSpan().CopyTo(span[x..]);
});

xが文字数を超えたときの処理など考えることはありますが、ご参考まで。

まるまる

コメントありがとうございます。まだまだ方法があるのですね。
inputメソッドもCreateメソッドも初めて知りました。
勉強になります。