如果我想连接字符串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?
类似的功能将在商业图书馆中实施,所以我真的需要“最佳”的方式来做到这一点。
答案 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具有“整理”内存管理,字符串连接(创建更多临时实例),因此这可能也会影响字符串循环之外的整体性能(如下一次垃圾收集器运行时)。
告诉我们你是怎么过的。