将字符串列表合并为一个字符串

232

假设你有以下内容:

List<string> los = new List<string>();
在这个充满函数式编程的世界中,以下哪种方法最适合通过连接这些字符串来创建一个新字符串:
String.Join(String.Empty, los.ToArray());

StringBuilder builder = new StringBuilder();
los.ForEach(s => builder.Append(s));

string disp = los.Aggregate<string>((a, b) => a + b);

或者使用普通的 StringBuilder 循环,还有更好的方式吗?


10
看起来 .Net 4 将包括一个 string.Join(string, IEnumerable<string>) 方法,让你可以跳过使用 ToArray()。http://msdn.microsoft.com/en-us/library/dd783876.aspx - luke
6个回答

323

我会选择A选项:

String.Join(String.Empty, los.ToArray());

我的理由是因为Join方法就是为这个目的而编写的。实际上,如果你查看反射器(Reflector),你会发现它使用了不安全的代码来进行真正的优化。另外两种方法也可以实现,但我认为Join函数是为此目的而编写的,并且我猜测它是最有效的。虽然我可能错了...

根据@Nuri YILMAZ的说法,不使用.ToArray(),但这是.NET 4以上版本可用:

String.Join(String.Empty, los);

2
比 StringBuilder 快 3 倍?哇,我想它会更快,但没想到会这么快。不过这很有道理,因为它使用指针在不安全的代码中完成,所以......很有道理。 - BFree
8
好的!唯一需要注意的是:Join 方法不需要使用 los.ToArray(),因为 List<T> 可以转换成 IEnumerable<T>。 - Nuri YILMAZ
8
@Nuri:这个问题是在08年提出的,当时还没有 .Net 4。接受 IEnumerable<T> 参数的那个重载是在 .Net 4 中新增的。 - BFree
@BFree:我明白了,你是对的!我没有注意到发布日期,非常抱歉。 - Nuri YILMAZ
2
String.Join与String.Concat结合使用是非常好的。例如:'String.Concat("{ ", String.Join(", ", m_Data), " }");' - KornMuffin
显示剩余2条评论

55
string.Concat(los.ToArray());

如果您只想连接字符串,则使用string.Concat()而不是string.Join()。


我认为这应该是被接受的答案。 - aradalvand

19

如果你使用的是 .NET 4.0,你可以使用一种更简单的方法:

String.Join<string>(String.Empty, los);

10

String.Join()实现速度很快,而且由于你已经拥有了相关字符串的集合,它很可能是最好的选择。最重要的是,它会呼喊着"我正在连接一系列字符串!" 总是很不错。


10
los.Aggregate((current, next) => current + "," + next);

5

我投票使用string.Join。

不需要使用lambda表达式和创建临时函数,减少函数调用,减少栈的推入和弹出。


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