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

本文关键字:字符串 数组 | 更新日期: 2023-09-27 18:25:18

我有一个大约20000000个值的字符串数组。我需要把它转换成字符串

我试过:

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

但这需要很长时间

有人知道更快的路吗?

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

尝试StringBuilder:

StringBuilder sb = new StringBuilder();
foreach (var i in tm)
{
    sb.Append(i);
}

要获得结果String,请使用ToString():

string result = sb.ToString();

答案将取决于输出字符串的大小以及可用和可用的内存量。字符串长度的硬限制似乎是2^31-1(int.MaxValue)个字符,占用的内存刚刚超过4GB。你是否能真正分配它取决于你的框架版本等。如果你要产生更大的输出,那么你无论如何都不能把它放在一个字符串中。

你已经发现,天真的串联会非常缓慢。问题是,每次通过循环都会创建一个新字符串,然后在下一次迭代中立即丢弃它。这将很快填满内存,迫使垃圾回收器加班加点地寻找旧字符串来清除内存,更不用说内存碎片的数量和所有现代程序员不太注意的东西了

StringBuiler是一个合理的解决方案。在内部,它分配字符块,然后在最后使用指针和内存副本将其缝合在一起。这样可以省去很多麻烦,而且速度很快。

至于String.Join。。。它使用CCD_ 6。String.Concat也是如此,尽管在不插入分隔符的情况下肯定会更快。

为了简单起见,我会使用String.Concat并完成它

但我不太喜欢简单。

下面是一个未经测试的、可能非常慢的使用LINQ的答案。当我有时间的时候,我会测试它,看看它的性能如何,但现在:

string result = new String(lines.SelectMany(l => (IEnumerable<char>)l).ToArray());

显然,这里存在潜在的溢出,因为ToArray调用可能会创建一个大于String构造函数所能处理的数组。试试看它是否和String.Concat一样快。

所以您可以在LINQ中这样做。

string data = tm.Aggregate("", (current, i) => current + i);

或者你可以使用字符串。加入功能

string data = string.Join("", tm);

现在无法检查,但我很好奇这个选项会如何执行:

var data = String.Join(string.Empty, tm);

Join是否已优化并忽略了与String.Empty的串联?

对于这种大数据,不幸的是,基于内存的方法将失败,这将是GC真正头疼的问题。对于这个操作,创建一个文件并将每个字符串放入其中

using (StreamWriter sw = new StreamWriter("some_file_to_write.txt")){
    for (int i=0; i<tm.Length;i++)
        sw.Write(tm[i]);
}

尽量避免在这种要求性能的方法中使用"var"更正:"var"不影响性能。"动态"的确如此。