我有一个大约20,000,000个值的字符串数组。 我需要将其转换为字符串
我试过了:
string data = "";
foreach (var i in tm)
{
data = data + i;
}
但这花费的时间太长了
有人知道更快的方式吗?
答案 0 :(得分:2)
StringBuilder sb = new StringBuilder();
foreach (var i in tm)
{
sb.Append(i);
}
要获得结果String
使用ToString()
:
string result = sb.ToString();
答案 1 :(得分:1)
答案取决于输出字符串的大小以及可用和可用的内存量。字符串长度的硬限制似乎是2 ^ 31-1(int.MaxValue
)个字符,占用的内存超过4GB。是否可以实际分配依赖于您的框架版本等。如果您要生成更大的输出,那么无论如何都无法将其放入单个字符串中。
你已经发现天真的连接速度很慢。问题是每次循环都会创建一个新字符串,然后在下一次迭代时立即丢弃它。这将很快填满内存,迫使垃圾收集器加班查找旧字符串以清除内存,更不用说内存碎片的数量以及现代程序员不太关注的所有内容
A StringBuiler
是一个合理的解决方案。在内部,它分配字符块,然后使用指针和内存副本在最后拼接在一起。通过这种方式节省了很多麻烦,速度非常快。
至于String.Join
... it uses a StringBuilder
。 String.Concat
也是如此,但不插入分隔符时肯定会更快。
为简单起见,我会使用String.Concat
并完成它。
但是,为了简单起见,我并不多。
这是使用LINQ的未经测试且可能非常缓慢的答案。当我有时间时,我会测试它并看看它是如何表现的,但是现在:
string result = new String(lines.SelectMany(l => (IEnumerable<char>)l).ToArray());
显然这里存在潜在的溢出,因为ToArray
调用可能会创建一个大于String
构造函数可以处理的数组。试一试,看看它是否与String.Concat
一样快。
答案 2 :(得分:0)
所以你可以在LINQ中这样做。
string data = tm.Aggregate("", (current, i) => current + i);
或者您可以使用string.Join函数
string data = string.Join("", tm);
答案 3 :(得分:0)
现在不能检查它,但我很好奇这个选项将如何执行:
var data = String.Join(string.Empty, tm);
Join
是否已优化,并忽略了与String.Empty
的连接a?
答案 4 :(得分:0)
对于这个大数据,遗憾的是基于内存的方法将失败,这将是GC的真正头痛。对于此操作,请创建一个文件并将每个字符串放入其中。像这样:
using (StreamWriter sw = new StreamWriter("some_file_to_write.txt")){
for (int i=0; i<tm.Length;i++)
sw.Write(tm[i]);
}
尽量避免使用&#34; var&#34;这种性能要求很高的方法。更正:&#34; var&#34;不影响性能。 &#34;动态&#34;确实