从StringBuilder的末尾修剪空白而不调用ToString()。Trim()并返回到新的SB

尼古拉斯·彼得森

什么是从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

writeCharacteristic()返回true,但不调用onCharacteristicWrite()

为什么布尔基元不调用原型toString()?

在html字符串的末尾修剪新行

一旦到达列表的末尾,返回到开头,python

每次对StringBuffer#toString和StrinBuilder#toString的调用都会从字符串池返回新实例还是实例?

如何返回到调用宏的工作表?

暂停协程并返回到调用方

调用模态窗口并返回到原始窗口

将内嵌评论返回到新行

Numpy.tostring 並返回到數組

如何修剪java stringbuilder?

StringBuilder是否在ToString()调用时缓存生成的字符串?

在Swift 3中仅修剪字符串末尾的空白

如何修剪UITextView字符串末尾的所有空白和换行符

从NSString的末尾修剪空格

调试器不会从调用函数返回到被调用函数

创建新函数并传递参数而不调用它

新关键字:为什么不调用派生方法?

为什么在函数返回时不调用复制构造函数?

Laravel 5.8 中的函数返回不调用 else 条件

返回大值的NSUserAppleScriptTask永不调用completionHandler

在不调用图形的函数中返回颜色条

为什么在函数返回后不调用desctructor?

从 StartActivity(ActivityFlags.NewTask) 返回时不调用 BroadcastReceiver OnReceive

是否可以返回带参数的函数但不调用它?

如何在不调用新“窗口”的情况下调用新活动

映射操作后,Stream.forEach为什么不调用Object的toString?

PHP trim()不修剪空间

如何修剪空白?