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本身不是问题。 问题是你在循环中连接字符串。 当您使用+运算符连接两个字符串时,必须在内存中分配一个新位置,并将两个字符串复制到其中。 因此,如果你使用+五次,你实际上创建了五个新字符串。 这就是你应该使用StringBuilderJoin来避免这种情况的原因。

如果你想使用Join和linq以获得更好的可读性,你仍然可以,不要使用Aggregate而是SelectToArray

像这样的东西?

 string joined = string.Join(",", myItems.Select(x => x.Name).ToArray());