C#.net core 基礎 - 刪除字符串最后一個字符的七大類N種實現方式以及性能測試
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
01、第一類、字符串方式這類方法是通過string類型自身方法直接實現。 1、Substring方法相信大多數人第一個想到的可能就是這個方法。Substring方法是字符串內置方法,可以通過指定起始索引位置為0以及長度為字符串長度減1,直接截取指定長度的子字符串,從而達到刪除最后一個字符目的。 示例代碼如下:
2、范圍運算符這個方法可以說是最簡潔的方法,可能大家用的不是很多。范圍運算符是從C# 8開始支持的。它的形式如:variate[start..end],指定某一索引范圍的開頭和末尾作為其操作數。左側操作數是范圍的包含性開頭。右側操作數是范圍的不包含性末尾。任一操作數都可以是序列開頭或末尾的索引。 下面列舉了表達集合范圍的各種方法: 范圍運算符也適用于字符串,實現代碼如下:
3、Remove方法Remove方法是字符串內置方法,可以刪除從指定起始索引位置起到結尾的所有字符,因此可以把起始索引定為最后一個字符,從而達到刪除最后一個字符目的。 示例代碼如下:
4、Create方法Create方法是字符串的靜態方法,這個方法相信大家用的比較少,其作用是創建一個具有特定長度的新字符串,并在創建后使用指定的回調對其進行初始化。下面我們直接看下實現代碼:
下面對上面代碼做個簡單解釋,第一個參數source.Length - 1是創建比原字符串長度少1位的目標字符串;第二個參數source是把原字符串當作參數傳入,用于給第三個參數使用;第三個參數是一個兩個參數無返回值委托,其中span參數表示目標字符串對應的Span 5、小結上面四種方法主要是使用了字符串自身的內置方法進行操作,下面我們對四個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過測試結果不難發現,除了Create方法,其他三個方法差別不大,綜合來看可以說Remove最優。 02、第二類、StringBuilder方式如果需要對大量字符串操作,相信大家會立即想到用StringBuilder來進行性能優化,下面簡單介紹兩種使用StringBuilder方式來刪除字符串最后一個字符。 1、Append方法字符串就相當于字符數組,因此我們可以循環字符串,然后使用StringBuilder的Append方法進行拼接,實現代碼如下:
2、Length方式相信大家看到這個標題應該比較疑惑,這是什么意思,我們先看代碼再講解:
首先第一行代碼表示通過原字符串創建一個可變字符串;重點就在第二行,直接對StringBuilder長度執行減1操作;最后再把StringBuilder轉為字符串返回。 首先StringBuilder的Length屬性表示當前可變字符串包含的字符數,當對其進行減1操作時,相當于告訴StringBuilder對象忽略最后一個字符,其內部并沒有真的刪除任何字符,被忽略的字符仍包含再StringBuilder對象內部,只是不再將其視為字符串的一部分,因此在調用.ToString方法時返回的就是我們想要的字符串。 3、小結下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過這組測試結果很容易發現,直接操作Length屬性性能顯著優越于Append方法,但是和字符串直接操作的方式相比還差了不少。 03、第三類、Array方式上面我們提到字符串相當于字符數組,因此我們可以直接使用數組相應的方法。 1、For方法我們可以直接構建一個目標字符數組,然后把原字符串中相應的字符復制到新字符數組中,最后把新字符數組轉成字符串返回即可,代碼如下:
2、Resize 方法這個方法大家可能用的比較少,它可以把數組元素個數更改為指定的大小。其思想有點像上面StringBuilder對象直接修改Length屬性。下面直接看看代碼:
3、CopyTo方法這個方法相信大家應該有點影響,我們前面的文章也有提到過。簡單來說就是把原數組復制到目標數組中,代碼如下:
4、String方式String方式是值當把原字符串轉換為字符數組后,直接使用String構造方法從字符數組中指定位置處開始并指定長度,來獲取我們想要的結果。代碼如下:
其中字符串構造函數第一個參數表示字符數組,第二個參數表示從字符數組第0個索引開始,第三個參數表示取字符數組的元素個數。 5、小結同樣對上面四種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過測試結果不難發現,CopyTo方法和String方式相對較好,比之StringBuilder方式還要好些。 04、第四類、Linq方式Linq方式的核心思想是通過Linq方法獲取目標字符串對應的字符數組,然后再轉為字符串返回。 1、Take方法Take方法主要作用是從序列的開頭返回指定數目的連續元素,因此代碼實現如下:
2、SkipLast方法SkipLast方法是從C# 8才開始有的,其作用是返回集合排除最后指定個數的元素外的所有元素。
3、Range + Select方法Range方法相信大家用的也比較少,其作用是生成指定范圍內的整數序列。我們先來看代碼然后再做解釋:
這里Range方法相當于生成了目標字符串索引序列,即[0.. source.Length - 1],然后再通過Seletc方法取原字符串相應的字符,最后得到結果。 4、小結同樣對上面三種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過測試結果不難發現,Range + Select方法相對較好,但是比之前幾類方法就差的太遠了。 05、第五類、Linq + String組合方式這類方法是通過Linq方法和字符串方法組合的方式實現。 1、Concat方法Concat方法是字符串的靜態方法可以連接多個字符成為一個新的字符串,然后通過Linq的SkipLast方法配合達到我們的目的,代碼如下:
2、Join方法Join方法也是字符串的靜態方法,主要作用是使用指定的分隔符連接集合的成員。因此也可以達到Concat類似的效果。
3、小結下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過這組測試結果說明兩者相差不大,相對于之前的方法更差了。 06、第六類、數據視圖方式數據視圖方式的核心思想是通過Span、Memory和ArraySegment實現。 1、AsSpan方法Span
2、AsMemory方法Memory
3、ArraySegment方法ArraySegment
4、小結同樣對上面三種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過測試結果可以發現,三種方法性能都是相當高,當然其中ArraySegment方法相對要差一些。總統來說數據視圖方式已經和第一類字符串方式不相上下了。 07、第七類、正則表達式方式這里解釋兩種正則表達式實現的方法。 1、Replace方法Replace方法是Regex的靜態方法,代碼如下:
2、Match方法Match方法也是Regex的靜態方法,代碼如下:
3、小結下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。 通過這組測試結果說明兩者相差不大,相對于之前的方法性能差別居中。 從整體來看,使用第一類字符串方式性能又高代碼又簡潔是最優選,而列舉了那么多種方法主要目的還是熟悉一些基礎方法,雖然在這個案例里不是最優解,但是說不定在其他地方就用的恰到好處。 我們都知道做同樣一件事件可能有很多種方法,然后可以選擇出一種最優的方法,但是這個前提是你要知道這些方法是什么,你才能有的選。 注:測試方法代碼以及示例源碼都已經上傳至代碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Planner 轉自https://www.cnblogs.com/hugogoos/p/18453906 該文章在 2024/12/20 9:51:16 編輯過 |
關鍵字查詢
相關文章
正在查詢... |