什么是从a的末尾修剪空白StringBuilder
而不调用ToString()。Trim()并返回到新SB的有效方法new StringBuilder(sb.ToString().Trim())
。
以下是扩展方法,因此您可以这样调用它:
sb.TrimEnd();
同样,它返回SB实例,允许您链接其他调用(sb.TrimEnd().AppendLine()
)。
public static StringBuilder TrimEnd(this StringBuilder sb)
{
if (sb == null || sb.Length == 0) return sb;
int i = sb.Length - 1;
for (; i >= 0; i--)
if (!char.IsWhiteSpace(sb[i]))
break;
if (i < sb.Length - 1)
sb.Length = i + 1;
return sb;
}
笔记:
1)如果为Null或Empty,则返回。
2)如果实际上不需要Trim,那么我们说的返回时间非常快,可能最昂贵的调用是对char.IsWhiteSpace的单个调用。因此,与这些ToString()。Trim()返回SB路由相反,在不需要时调用TrimEnd几乎是零开销。
3)另外,如果需要修剪,最昂贵的东西是对char.IsWhiteSpace的多次调用(在第一个非空白char上中断)。当然,循环是向后迭代的。如果全部为空白,则最终的SB.Length为0。
4)如果遇到空格,则将i索引保留在循环之外,这使我们可以使用它适当地削减Length。在StringBuilder中,这是非常出色的性能,它只是设置了一个内部长度整数(内部char []保持相同的内部长度)。
UPDATE2:参见Ryan Emerle的精彩注释,如下所述,它纠正了我的一些误解(SB的内部工作比我想像的要复杂一些):
从技术上讲,StringBuilder是char []块的链接列表,因此我们不会出现在LOH中。从技术上讲,调整长度并不像更改结束索引那样简单,因为如果移入另一个块,则必须保持容量,因此可能需要分配新的块。不过,您只能在末尾设置Length属性,因此这似乎是一个不错的解决方案。埃里克·利珀特(Eric Lippert)的相关详细信息:https : //stackoverflow.com/a/6524401/62195
另外,请参阅这篇讨论.NET 4.0新StringBuilder实现的好文章:http : //1024strongoxen.blogspot.com/2010/02/net-40-stringbuilder-implementation.html
-------更新--------
以下内容说明了更改StringBuilder Length时发生的情况(此处仅对SB进行了唯一的实际操作,并且仅在需要时执行):
StringBuilder sb = new StringBuilder("cool \t \r\n ");
sb.Capacity.Print(); // 16
sb.Length.Print(); // 11
sb.TrimEnd();
sb.Capacity.Print(); // 16
sb.Length.Print(); // 4
您可以看到内部数组(m_ChunkChars)更改了Length后保持不变,实际上,您可以在调试器中看到它甚至不会覆盖(在这种情况下为空白)字符。他们是孤儿。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句