C#大字符串数组到字符串

时间:2015-12-01 19:52:31

标签: c# arrays string performance

我有一个大约20,000,000个值的字符串数组。 我需要将其转换为字符串

我试过了:

    string data = "";
    foreach (var i in tm)
    {
        data = data + i;
    }

但这花费的时间太长了

有人知道更快的方式吗?

5 个答案:

答案 0 :(得分:2)

尝试StringBuilder

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 StringBuilderString.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;确实