如果我想连接一个字符串 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 来调用此方法。我应该使用什么方法?

字符串.加入?弦乐建造者?只是标准字符串。Concat?

类似的功能将在商业库中实现,所以我真的需要“最佳”方法来做到这一点。

有帮助吗?

解决方案

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

其他提示

当然是弦乐建造者。它适用于快速字符串连接操作,因为它不会在每次连接字符串时创建新对象。

详情请参阅 这里.

的StringBuilder。

“结果+ =结果;”

创建一个新字符串每个你做作业的时间,而新的字符串分配给您的变量,因为字符串是不可变的。

访问与StringBuilder的,绝对

决不让一个假设,即一个方法比另一种更快速 - 你必须送花儿给人同时测量的性能,然后再决定

出人意料地,对于更小的数字的迭代,只是一个标准的字符串连接(结果+ =串)通常比使用的字符串生成器更快。

如果您知道迭代的数量将始终是相同的(例如,它永远是50次迭代),那么我会建议你采用不同的方法进行一些性能测试。

如果您的真正的要弄巧,使性能测量对迭代次数,您可以找到“交叉点”,其中一个方法比另一种速度更快,硬编码门限,该方法:

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

确切效果交叉点,将取决于你的代码的具体细节,你将永远无法找出它们是什么未做性能测量。

要复杂的东西多一点,StringBuilder的具有“整洁”的内存管理是字符串连接(产生更多的临时的实例),所以这也可能对整体性能的弦圈以外的影响(在下一次垃圾收集像运行时)。

让我们知道你是怎么得到的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top