3

文字列をN回連結したい場合、どちらの方法を選択すればよいですか?

このコードを例として取り上げます。

public static string Repeat(this string instance, int times)
{
        var result = string.Empty;

        for (int i = 0; i < times; i++)
            result += instance;

        return result;
}

このメソッドは、「times」を5または5000に設定して呼び出すことができます。どのメソッドを使用する必要がありますか?

string.Join?Stringbuilder?標準のstring.Concat?

同様の関数が商用ライブラリに実装される予定なので、これを行うための「最適な」方法が本当に必要です。

4

4 に答える 4

8
    public static string Repeat(this string instance, int times)
    {
        if (times == 1 || string.IsNullOrEmpty(instance)) return instance;
        if (times == 0) return "";
        if (times < 0) throw new ArgumentOutOfRangeException("times");
        StringBuilder sb = new StringBuilder(instance.Length * times);
        for (int i = 0; i < times; i++)
            sb.Append(instance);
        return sb.ToString();
    }
于 2009-10-12T06:34:45.230 に答える
5

ストリングビルダーのコース。文字列を結合するたびに新しいオブジェクトが作成されるわけではないため、高速の文字列結合操作を目的としています。

詳細については、こちらをご覧ください

于 2009-10-12T06:33:54.340 に答える
2

StringBuilder。

"結果+=結果;"

文字列は不変であるため、割り当てを行うたびに新しい文字列を作成し、その新しい文字列を変数に割り当てます。

間違いなく、StringBuilderを使用してください。

于 2009-10-12T06:34:17.193 に答える
2

ある方法が別の方法よりも速いと思い込まないでください。常に両方のパフォーマンスを測定してから決定する必要があります。

驚くべきことに、反復回数が少ない場合は、標準の文字列連結(結果+ =文字列)だけが文字列ビルダーを使用するよりも高速であることがよくあります。

反復回数が常に同じであることがわかっている場合(たとえば、常に50回の反復になる)、さまざまな方法を使用してパフォーマンス測定を行うことをお勧めします。

本当に賢くしたい場合は、反復回数に対してパフォーマンスを測定すると、あるメソッドが別のメソッドよりも高速である「クロスオーバーポイント」を見つけて、そのしきい値をメソッドにハードコーディングできます。

if(iterations < 30)
{
    CopyWithConcatenation();
}
else
{
    CopyWithStringBuilder();
}

正確なパフォーマンスクロスオーバーポイントはコードの特定の詳細に依存し、パフォーマンス測定を行わずにそれらが何であるかを知ることはできません。

さらに複雑なことに、StringBuilderには文字列連結(より多くの一時インスタンスを作成する)という「より適切な」メモリ管理があるため、これは文字列ループ外の全体的なパフォーマンスにも影響を与える可能性があります(次回のガベージコレクターの実行時など)。

どうやって乗ったのか教えてください。

于 2009-10-12T07:35:50.720 に答える