在一个关于将double[][]格式化为CSV格式的previous question中,it was suggested表示使用StringBuilder将比使用String.Join更快.这是真的吗?

推荐答案

简短的回答是:这要看情况而定.

答案很长:if you already have an array of strings to concatenate together (with a delimiter), 100 is the fastest way of doing it.

String.Join可以查看所有字符串,计算出它需要的确切长度,然后再次复制所有数据.这意味着将有no个额外的复制涉及.缺点是,它必须对字符串进行两次判断,这意味着可能会超出必要的次数来 destruct 内存缓存.

如果您事先将字符串作为数组,那么使用StringBuilder会更快probably,但也会有不使用StringBuilder的情况.如果使用StringBuilder意味着大量复制,那么构建一个数组,然后调用String.Join可能会更快.

编辑:这是一次呼叫String.Join,而不是一次呼叫StringBuilder.Append.在最初的问题中,我们有两个不同级别的String.Join个调用,因此每个嵌套调用都会创建一个中间字符串.换句话说,它更复杂,更难猜测.我会惊讶地发现,在典型数据中,任何一种方式都能显著地"获胜"(从复杂性的Angular 来看).

编辑:当我在家的时候,我会写一个基准,这可能对StringBuilder人来说是痛苦的.基本上,如果您有一个数组,其中每个元素的大小大约是前一个元素的两倍,并且您做得恰到好处,那么您应该能够强制每个追加(元素的副本,而不是分隔符的副本,尽管这也需要考虑在内).在这一点上,它几乎和简单的字符串连接一样糟糕-但是String.Join不会有问题.

.net相关问答推荐

ECS服务无法从Cognito获取配置

使用 Thread.Abort() 有什么问题

单击关闭按钮时隐藏表单而不是关闭

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

使文本框不可编辑

编译错误:显式实现接口时修饰符 'public' 对此项目无效

如何在不丢失数据的情况下重命名 Entity Framework 5 Code First 迁移中的数据库列?

在安全处理异常时避免首次机会异常消息

C# 的浮点比较函数

软件包版本始终为 1.0.0,带有 dotnet pack

检索字典值最佳实践

单元测试 C# 保护方法

为什么 C# 不推断我的泛型类型?

Find() 和 First() 抛出异常,如何改为返回 null?

如何从文件中删除单个属性(例如只读)?

MailMessage,Sender 和 From 属性的区别

安装带有恢复操作的 Windows 服务以重新启动

如何在 C# 中处理 XML

在 WPF 中设置 Tab 键顺序

从不同程序集中的类名中解析类型