StringBuilder是否仅在循环场景中首选?

时间:2013-08-13 03:19:12

标签: c# stringbuilder

我理解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的创建开销不值得的阈值?

3 个答案:

答案 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也可能是一本很好的读物。