一般的な用途では、StringBuilderクラスを含むソリューションは、複数文字の文字列を繰り返すのに最適です。単純な連結では不可能であり、手作業でより効率的に行うことが困難または不可能であるような方法で、多数の文字列の組み合わせを処理するように最適化されています。ここに示されているStringBuilderソリューションはO(N)の反復を使用して完了します。これは、繰り返される回数に比例した均一レートです。
ただし、非常に多数の繰り返しがある場合、または高効率を排除する必要がある場合、より良いアプローチは、StringBuilderの基本機能と同様のことを行うが、元の文字列からではなく、宛先から追加のコピーを作成することです。以下のように。
public static string Repeat_CharArray_LogN(this string str, int times)
{
int limit = (int)Math.Log(times, 2);
char[] buffer = new char[str.Length * times];
int width = str.Length;
Array.Copy(str.ToCharArray(), buffer, width);
for (int index = 0; index < limit; index++)
{
Array.Copy(buffer, 0, buffer, width, width);
width *= 2;
}
Array.Copy(buffer, 0, buffer, width, str.Length * times - width);
return new string(buffer);
}
これにより、反復ごとにソース/デスティネーション文字列の長さが2倍になり、元の文字列を通過するたびにカウンターをリセットするオーバーヘッドが節約され、現在のより長い文字列をスムーズに読み取ってコピーできるようになりました。より効率的に。
これは、2を底とする対数を使用して、文字列の長さを2倍にする必要がある回数を検出し、その回数だけ計算を続けます。コピーされる残りの部分は、コピー元の全長より短いので、すでに生成されているもののサブセットをコピーするだけで済みます。
StringBuilderを使用してArray.Copy()メソッドを使用しました。これは、StringBuilderのコンテンツをそれ自体にコピーすると、そのコンテンツで新しい文字列を生成するたびにオーバーヘッドが発生するためです。Array.Copy()はこれを回避しながら、非常に高い効率で動作します。
このソリューションは、完了するまでにO(1 + log N)の反復を必要とします。これは、反復回数に応じて対数的に増加するレートです(反復回数を2倍にすると、追加の反復が1回になります)。他の方法よりも大幅に節約でき、比例して増加します。