如何将 string[] 组合成一个带有空格的字符串

22
如何将string[]解析为带有空格的字符串 你会如何重构这段代码?
    internal string ConvertStringArrayToString(string[] array)
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(array[0]);
        for (int i = 1; i < array.Length; i++)
        {
            builder.Append(' ');
            builder.Append(array[i]);
        }
        return builder.ToString();
    }

3
这不是解析,而是一种组合形式。 - H H
3个回答

49

已经有一个方法可以做到这一点:

String.Join(" ", array)

这将在每个元素之间添加一个空格。请注意,如果任何一个元素是空字符串,那么您最终会得到相邻的空格,因此您可能需要提前过滤这些空字符串,例如:

String.Join(" ", array.Where(s => !String.IsNullOrEmpty(s))) 

3
“看起来有点过度...” - 这取决于它的使用频率而非它的简单程度。如果你想获得一个逻辑单元,你需要一个清晰的定义。 - H H
1
@HenkHolterman:是的,你说得对,可能有理由将琐碎的代码放在一个方法中,只是为了给它命名。 - Guffa
只是一点小提示,如果数组中的某个项为空,你最终会得到两个空格。有时候这是可取的,有时候则不是。String.Join(" ", array.Where(s => !String.IsNullOrEmpty(s))) 可以去除数组项之间的额外空格。 - Michael Silver
在大多数情况下,我使用 string.IsNullOrWhiteSpace 而不是 IsNullOrEmpty。 - user1775543
@user1775543:那是一个不错的选择。它是在.NET 4中引入的一种新方法,所以当回答写下来时并没有得到良好的支持。 - Guffa

4
internal string ConvertStringArrayToString(string[] array)
{
    return string.Join(" ", array);
}

当然,仅仅调用另一个方法是很愚蠢的,因此你可以直接删除你的方法...

我同意你对这种情况的陈述,但不同意“拥有一个只调用另一个方法是愚蠢的”这个笼统的说法。当遵守Demeter法则以及在第三方API周围生成包装器时,方法转发非常有用,因为任何破坏性更改都可以在一个地方捕获和处理。 - Lukazoid
@Lukazoid同意,当处理第三方API或者想要在方法中添加前置条件时,使用装饰器会很有帮助。 - Rowland Shaw

0

使用 LINQ Aggregate() 方法:

string result = array.Aggregate((acc, next) => acc + " " + next);

3
我很好奇这个版本与原版相比表现如何,因为它似乎在处理过程中分配了更多的字符串对象。 - Rowland Shaw
没错,LINQ不是免费的。我相信在这种情况下,String.Join会是一个很好的解决方案。顺便说一句,我无法使用反射器看到String.Join的实现,看看它如何进行连接将会非常有趣,因为字符串是不可变的,所以可能聚合将在相对相同的时间/内存复杂度下执行? - sll
String.Join 的实现很可能通过将数组中的字符串长度和分隔符相加来确定最终字符串的大小,然后分配一个字符串缓冲区,将字符串复制到其中,并将字符串缓冲区作为字符串返回。与之相比,Aggregate 解决方案的性能实际上非常差,因为它会一遍又一遍地复制相同的数据。随着每个额外的数组项,执行时间大致翻倍,所以如果你有一个很长的数组,它会变得非常慢。 - Guffa
String.join在内部使用了一个stringbuilder。如果您使用已看到的重载并在其中初始化一个stringbuilding,那么聚合方法也将非常有效。 - Gusdor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接