C# 对于N次迭代,使用什么字符串连接方法?

C# 对于N次迭代,使用什么字符串连接方法?,c#,string-concatenation,C#,String Concatenation,如果我想将一个字符串连接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; } 公共静态字符串重复(此字符串实例

如果我想将一个字符串连接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;
}
公共静态字符串重复(此字符串实例,int次)
{
var result=string.Empty;
for(int i=0;i
调用此方法时,可以将“时间”设置为5或5000。我应该用什么方法

串,加入?Stringbuilder?只是标准的字符串,康卡特


类似的函数将在商业库中实现,因此我确实需要“最佳”方法来实现这一点。

Stringbuilder当然。它用于快速字符串连接操作,因为它不会在每次您想要连接字符串时创建新对象

有关详细信息,请参见。

StringBuilder

“结果+=结果;”

每次赋值时都创建一个新字符串,并将该新字符串赋值给变量,因为字符串是不可变的

一定要使用StringBuilder。

公共静态字符串重复(此字符串实例,int次)
    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();
    }
{ if(times==1 | | string.IsNullOrEmpty(instance))返回实例; 如果(次==0)返回“”; 如果(次<0)抛出新ArgumentOutOfRangeException(“次”); StringBuilder sb=新StringBuilder(instance.Length*次); for(int i=0;i
永远不要假设一种方法比另一种方法快——您必须始终衡量这两种方法的性能,然后做出决定

令人惊讶的是,对于较小的迭代次数,仅使用标准字符串连接(result+=string)通常比使用字符串生成器更快

如果您知道迭代次数总是相同的(例如,它总是50次迭代),那么我建议您使用不同的方法进行一些性能度量

如果你真的想变得聪明,根据迭代次数进行性能测量,你可以找到一种方法比另一种方法快的“交叉点”,并将该阈值硬编码到方法中:

if(iterations < 30)
{
    CopyWithConcatenation();
}
else
{
    CopyWithStringBuilder();
}
if(迭代次数<30次)
{
CopyWithConcatenation();
}
其他的
{
CopyWithStringBuilder();
}
准确的性能交叉点将取决于代码的具体细节,如果不进行性能测量,您将永远无法发现它们是什么

更复杂的是,StringBuilder具有“更整洁”的内存管理,即字符串连接(这会创建更多临时实例),因此这也可能会影响字符串循环之外的总体性能(如下次运行垃圾回收器时)


让我们了解您的进展情况。

为什么不在第4行返回string.Empty?”“是string.Empty,从MSDN开始:[此字段的值是零长度字符串,”][1]。[1]: