3

I understand that StringBuilder is the choice for concatenating strings in a loop, like this:

List<string> myListOfString = GetStringsFromDatabase();
var theStringBuilder = new StringBuilder();

foreach(string myString in myListOfString)
{
    theStringBuilder.Append(myString);
}

var result = theStringBuilder.ToString();

But what are the scenarios where StringBuilder outperforms String.Join() or vice versa?

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", "?"
            });

Any guidance would be greatly appreciated.

EDIT: Is there a threshold where the creation overhead of the StringBuilder is not worth it?

4

3 回答 3

5

它似乎在代码(反射器)的引擎盖下string.Join使用: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在尝试根据条件连接字符串时使用。

于 2013-08-13T03:37:01.873 回答
1

String.Join 有几个重载。其中一些需要string[]和其他需要IEnumerable<string>。如果您查看它们的源代码,您会注意到它们的实现方式不同。

对于数组情况 String.Join 首先计算字符总数,然后分配该大小的字符串。

IEnumarable如果它只是StringBuilder.Append在里面使用。

因此,如果您有字符串数组,那么可能 String.Join 比StringBuilder.AppendIEnumarable 情况下的性能要快。

对于所有情况,我都建议使用它,String.Join因为它需要更少的代码。

于 2013-08-13T03:38:16.900 回答
-1

StringBuilder在内存使用方面,在大多数情况下将优于字符串操作。

我经常使用StringBuilder来构建完整的日志信息,因为我需要连接来自多个来源的信息。

杰夫阿特伍德的微优化剧院的悲惨悲剧也可能是一本好书。

于 2013-08-13T03:31:28.527 回答