使用哪种字符串拼接方法来进行N次迭代?

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个回答

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();
    }

1
为什么第4行不返回string.Empty呢? - Vinko Vrsalovic
"" 是 string.Empty,来自 MSDN:[该字段的值是零长度字符串,""]。 - Janis Veinbergs

5

当然是StringBuilder。它旨在快速连接字符串,因为每次连接字符串时它不会创建新对象。

详情请参见这里


2

不要假设某个方法比另一个方法更快 - 您必须始终测量两种方法的性能,然后决定。

令人惊讶的是,在迭代次数较少时,只使用标准字符串连接(result + = string)通常比使用字符串构建器更快。

如果您知道迭代次数将始终相同(例如,它将始终为50次迭代),那么我建议您使用不同的方法进行性能测量。

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

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

确切的性能交叉点将取决于您代码的具体细节,如果没有进行性能测量,您将无法找出它们。

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

请告诉我们您的进展情况。


2

StringBuilder。

"result += result;"

每次执行赋值操作都会创建一个新的字符串,并将该新字符串分配给变量,因为字符串是不可变的。

一定要使用 StringBuilder。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接