StringBuilder真的比Aggreggate快吗?
string c = tmpArr[0].Aggregate(string.Empty, (current, m) => current + (m.Name + " ")); StringBuilder sb = new StringBuilder(); foreach (Mobile m in tmpArr[0]) sb.Append(m.Name + " "); sb.ToString();
哪两个更快? 聚合肯定是更清洁,但它是快速还是与做的一样
foreach(Mobile m in tmpArr[0]) c += m.Name + " ";
我真正想做的是像string.Join(",",tmpArr[0])
,但我不希望它连接他们的ToString值,只是他们的名字,我怎么能做到最好?
我没有使用string.Join
问题是我实际上必须做这样的事情:
string separator = ""; StringBuilder sb = new StringBuilder(); foreach (Mobile m in tmpArr[0]) { separator = ", "; sb.Append(separator + m.Name); }
我不希望它连接他们的ToString值,只是他们的名字,我怎么能做到最好?
string.Join(",",tmpArr[0].Select(t => t.Name).ToArray())
但大多数时候它。 只是。 不。 物!
如果在循环中追加字符串( c += m.Name + " ";
),则会导致创建大量中间字符串; 这会导致“伸缩”内存使用,并给GC带来额外负担。 Aggregate与StringBuilder的fluent-API混合在一起可以提供帮助 – 但是与StringBuilder循环一样。 重要的不是聚合:它不会创建大量的中间字符串 。
例如,我会使用:
foreach (Mobile m in tmpArr[0]) sb.Append(m.Name).Append(" ");
甚至更少; p
对于在Aggregate中使用StringBuilder的类似示例:
string c = tmpArr[0].Aggregate(new StringBuilder(), (current, m) => current.Append(m.Name).Append(" ")).ToString();
由于字符串是不可变的,因此添加操作具有性能成本。 这是StringBuilder主要设计的内容,它的作用类似于“Mutable”String。 我没有对速度进行过多的基准测试,但对于内存优化,StringBuilder肯定更好。
Aggregate
针对IEnumerable
中的每个项运行匿名方法。 此方法传递给系统定义的Func<>
委托,该委托返回out参数。
它基本上就像运行一个多次执行追加的函数。
因此,对于方法调用等,堆栈上的分配/释放肯定比运行简单的for
/ foreach
循环有更多的开销
所以,在我看来, 第二种方法会更快。
Aggregate
本身不是问题。 问题是你在循环中连接字符串。 当您使用+
运算符连接两个字符串时,必须在内存中分配一个新位置,并将两个字符串复制到其中。 因此,如果你使用+
五次,你实际上创建了五个新字符串。 这就是你应该使用StringBuilder
或Join
来避免这种情况的原因。
如果你想使用Join
和linq以获得更好的可读性,你仍然可以,不要使用Aggregate
而是Select
和ToArray
。
像这样的东西?
上述就是C#学习教程:StringBuilder真的比Aggreggate快吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)
string joined = string.Join(",", myItems.Select(x => x.Name).ToArray());
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。
如若转载,请注明出处:https://www.ctvol.com/cdevelopment/991931.html