我有一个字符串,我必须编辑很多。长度未定义。 Replace(string, string)
将是最常用的方法。
什么是更好string.Replace("", "")
或StringBuilder.Replace("", "")
?
public static string FormatMyString(string input)
{
// ...
}
(代码示例简单而愚蠢。它们只是为了向您展示我正在做的事情。我总是得到问题:"您想做什么?&#34 ;)
答案 0 :(得分:2)
什么是更好
string.Replace("", "")
或StringBuilder.Replace("", "")
?
都不是。它们都没有用。在更一般的情况下:
String.Replace
的内部呼叫应该没问题StringBuilder
以避免使用中间字符串答案 1 :(得分:0)
IMHO String Builder是要走的路。
它具有创建成本,但由于更有效的字符串操作和连接,因此可以提供更好的性能。
正如我所说,这是一个成本所以你应该考虑做什么"编辑很多"意思。
很抱歉,我现在无法提供实际的基准测试结果,但我认为使用String Builder的门槛应该非常低......
希望这有帮助。
答案 2 :(得分:0)
你只是“询问”这些事情并没有得到任何好的价值。你需要基准测试。以此代码为例:
var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var s = (string)null;
for (var i = 0; i < 10000000; i++)
{
s = "a";
s += "b";
}
var cc1 = GC.CollectionCount(0);
sw.Stop();
Console.WriteLine(
"collections == {0}, ms == {1}, string == \"{2}\"",
cc1 - cc0,
sw.ElapsedMilliseconds,
s);
与此代码对比:
var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var sb = (StringBuilder)null;
for (var i = 0; i < 10000000; i++)
{
sb = new StringBuilder();
sb.Append("a");
sb.Append("b");
}
var cc1 = GC.CollectionCount(0);
Console.WriteLine(
"collections == {0}, ms == {1}, string == \"{2}\"",
cc1 - cc0,
sw.ElapsedMilliseconds,
sb.ToString());
我得到的两个结果是:
collections == 63, ms == 336, string == "ab" // +=
collections == 228, ms == 692, string == "ab" // StringBuilder
StringBuilder
占用的时间是原来的两倍,导致垃圾收集次数增加3.5倍以上。
当然,如果我要连接StringBuilder
表现更好的非常长的字符串,但除非我测量它,否则我不会知道这一点。
在我们说出什么是最好的之前,您需要提供更详细的信息,说明您正在运行的代码以及“更好”(更快,更少内存,易于阅读的代码等)的含义。