我理解StringBuilder
是在循环中连接字符串的选择,如下所示:
List<string> myListOfString = GetStringsFromDatabase();
var theStringBuilder = new StringBuilder();
foreach(string myString in myListOfString)
{
theStringBuilder.Append(myString);
}
var result = theStringBuilder.ToString();
但是StringBuilder
的表现优于String.Join()
,反之亦然?
var theStringBuilder = new StringBuilder();
theStringBuilder.Append("Is this ");
theStringBuilder.Append("ever a good ");
theStringBuilder.Append("idea?");
var result = theStringBuilder.ToString();
OR
string result = String.Join(" ", new String[]
{
"Or", "is", "this", "a", "better", "solution", "?"
});
非常感谢任何指导。
编辑:是否存在StringBuilder
的创建开销不值得的阈值?
答案 0 :(得分:5)
似乎string.Join
在代码(Reflector)的引擎盖下使用了StringBuilder
:
public static string Join(string separator, IEnumerable<string> values)
{
using (IEnumerator<string> enumerator = values.GetEnumerator())
{
if (!enumerator.MoveNext())
{
return Empty;
}
StringBuilder sb = StringBuilderCache.Acquire(0x10);
if (enumerator.Current != null)
{
sb.Append(enumerator.Current);
}
while (enumerator.MoveNext())
{
sb.Append(separator);
if (enumerator.Current != null)
{
sb.Append(enumerator.Current);
}
}
return StringBuilderCache.GetStringAndRelease(sb);
}
}
所以在你的场景中,它并没有太大的不同。但是,我希望在尝试根据条件连接字符串时使用StringBuilder
。
答案 1 :(得分:1)
String.Join有几个重载。其中一些需要string[]
和其他需要IEnumerable<string>
。如果您看到它们的源代码,您会注意到它们的实现方式不同。
对于数组大小写String.Join首先计算字符总数,然后分配该大小的字符串。
但对于IEnumarable
案例,它只是在里面使用StringBuilder.Append
。
因此,如果你有字符串数组,那么可能String.Join比StringBuilder.Append
快,但对于IEnumarable案例表现相同。
对于所有情况,我建议使用String.Join
,因为它需要更少的代码。
答案 2 :(得分:-1)
StringBuilder
在大多数情况下都会胜过字符串操作。
我经常使用StringBuilder
来构建完整的日志记录信息,因为我需要加入来自多个来源的信息。
Jeff Atwood的The Sad Tragedy of Micro-Optimization Theater也可能是一本很好的读物。