用于N次迭代的字符串连接方法是什么?

时间:2009-10-12 06:31:15

标签: 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;
}

可以在“时间”设置为5或5000的情况下调用此方法。我应该使用哪种方法?

的string.join? StringBuilder的?只是标准的string.Concat?

类似的功能将在商业图书馆中实施,所以我真的需要“最佳”的方式来做到这一点。

4 个答案:

答案 0 :(得分: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 :(得分:5)

Stringbuilder ofcourse。它适用于快速字符串连接操作,因为每次要加入字符串时都不会创建新对象。

有关详细信息,请参阅here

答案 2 :(得分:2)

的StringBuilder。

“结果+ =结果;”

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

绝对使用StringBuilder。

答案 3 :(得分:2)

永远不要假设一种方法比另一种方法更快 - 你必须总是衡量两者的表现,然后再决定。

令人惊讶的是,对于较少数量的迭代,只需标准字符串连接(结果+ =字符串)通常比使用字符串构建器更快。

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

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

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

确切的性能交叉点取决于代码的具体细节,如果不进行性能测量,您将永远无法找到它们的内容。

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

告诉我们你是怎么过的。