.net?core?刪除字符串最后一個(gè)字符的七大類N種實(shí)現(xiàn)方式(總結(jié)篇)
今天想通過和大家分享如何刪除字符串最后一個(gè)字符的N種實(shí)現(xiàn)方法,來(lái)回顧一些基礎(chǔ)知識(shí)點(diǎn)。
01、第一類、字符串方式
這類方法是通過string類型自身方法直接實(shí)現(xiàn)。
1、Substring方法
相信大多數(shù)人第一個(gè)想到的可能就是這個(gè)方法。Substring方法是字符串內(nèi)置方法,可以通過指定起始索引位置為0以及長(zhǎng)度為字符串長(zhǎng)度減1,直接截取指定長(zhǎng)度的子字符串,從而達(dá)到刪除最后一個(gè)字符目的。
示例代碼如下:
public static string StringSubstring(string source) { return source.Substring(0, source.Length - 1); }
2、范圍運(yùn)算符
這個(gè)方法可以說(shuō)是最簡(jiǎn)潔的方法,可能大家用的不是很多。范圍運(yùn)算符是從C# 8開始支持的。它的形式如:variate[start..end],指定某一索引范圍的開頭和末尾作為其操作數(shù)。左側(cè)操作數(shù)是范圍的包含性開頭。右側(cè)操作數(shù)是范圍的不包含性末尾。任一操作數(shù)都可以是序列開頭或末尾的索引。
下面列舉了表達(dá)集合范圍的各種方法:
范圍運(yùn)算符也適用于字符串,實(shí)現(xiàn)代碼如下:
public static string StringRangeOperator(string source) { return source[..^1]; }
3、Remove方法
Remove方法是字符串內(nèi)置方法,可以刪除從指定起始索引位置起到結(jié)尾的所有字符,因此可以把起始索引定為最后一個(gè)字符,從而達(dá)到刪除最后一個(gè)字符目的。
示例代碼如下:
public static string StringRemove(string source) { return source.Remove(source.Length - 1); }
4、Create方法
Create方法是字符串的靜態(tài)方法,這個(gè)方法相信大家用的比較少,其作用是創(chuàng)建一個(gè)具有特定長(zhǎng)度的新字符串,并在創(chuàng)建后使用指定的回調(diào)對(duì)其進(jìn)行初始化。下面我們直接看下實(shí)現(xiàn)代碼:
public static string StringCreate(string source) { return string.Create(source.Length - 1, source, (span, state) => { for (var i = 0; i < state.Length - 1; i++) { span[i] = state[i]; } }); }
下面對(duì)上面代碼做個(gè)簡(jiǎn)單解釋,第一個(gè)參數(shù)source.Length - 1是創(chuàng)建比原字符串長(zhǎng)度少1位的目標(biāo)字符串;第二個(gè)參數(shù)source是把原字符串當(dāng)作參數(shù)傳入,用于給第三個(gè)參數(shù)使用;第三個(gè)參數(shù)是一個(gè)兩個(gè)參數(shù)無(wú)返回值委托,其中span參數(shù)表示目標(biāo)字符串對(duì)應(yīng)的Span,state參數(shù)表示原字符串即第二個(gè)參數(shù)值,for循環(huán)即是把原字符串字符循環(huán)賦值給目標(biāo)字符串。
5、小結(jié)
上面四種方法主要是使用了字符串自身的內(nèi)置方法進(jìn)行操作,下面我們對(duì)四個(gè)方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過測(cè)試結(jié)果不難發(fā)現(xiàn),除了Create方法,其他三個(gè)方法差別不大,綜合來(lái)看可以說(shuō)Remove最優(yōu)。
02、第二類、StringBuilder方式
如果需要對(duì)大量字符串操作,相信大家會(huì)立即想到用StringBuilder來(lái)進(jìn)行性能優(yōu)化,下面簡(jiǎn)單介紹兩種使用StringBuilder方式來(lái)刪除字符串最后一個(gè)字符。
1、Append方法
字符串就相當(dāng)于字符數(shù)組,因此我們可以循環(huán)字符串,然后使用StringBuilder的Append方法進(jìn)行拼接,實(shí)現(xiàn)代碼如下:
public static string StringBuilderAppend(string source) { var sb = new StringBuilder(); for (var i = 0; i < source.Length - 1; i++) { sb.Append(source[i]); } return sb.ToString(); }
2、Length方式
相信大家看到這個(gè)標(biāo)題應(yīng)該比較疑惑,這是什么意思,我們先看代碼再講解:
public static string StringBuilderLength(string source) { var sb = new StringBuilder(source); sb.Length--; return sb.ToString(); }
首先第一行代碼表示通過原字符串創(chuàng)建一個(gè)可變字符串;重點(diǎn)就在第二行,直接對(duì)StringBuilder長(zhǎng)度執(zhí)行減1操作;最后再把StringBuilder轉(zhuǎn)為字符串返回。
首先StringBuilder的Length屬性表示當(dāng)前可變字符串包含的字符數(shù),當(dāng)對(duì)其進(jìn)行減1操作時(shí),相當(dāng)于告訴StringBuilder對(duì)象忽略最后一個(gè)字符,其內(nèi)部并沒有真的刪除任何字符,被忽略的字符仍包含再StringBuilder對(duì)象內(nèi)部,只是不再將其視為字符串的一部分,因此在調(diào)用.ToString方法時(shí)返回的就是我們想要的字符串。
3、小結(jié)
下面我們對(duì)兩個(gè)方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過這組測(cè)試結(jié)果很容易發(fā)現(xiàn),直接操作Length屬性性能顯著優(yōu)越于Append方法,但是和字符串直接操作的方式相比還差了不少。
03、第三類、Array方式
上面我們提到字符串相當(dāng)于字符數(shù)組,因此我們可以直接使用數(shù)組相應(yīng)的方法。
1、For方法
我們可以直接構(gòu)建一個(gè)目標(biāo)字符數(shù)組,然后把原字符串中相應(yīng)的字符復(fù)制到新字符數(shù)組中,最后把新字符數(shù)組轉(zhuǎn)成字符串返回即可,代碼如下:
public static string ArrayFor(string source) { var chars = new char[source.Length - 1]; for (var i = 0; i < chars.Length; i++) { chars[i] = source[i]; } return new string(chars); }
2、Resize 方法
這個(gè)方法大家可能用的比較少,它可以把數(shù)組元素個(gè)數(shù)更改為指定的大小。其思想有點(diǎn)像上面StringBuilder對(duì)象直接修改Length屬性。下面直接看看代碼:
public static string ArrayResize(string source) { var chars = source.ToCharArray(); Array.Resize(ref chars, chars.Length - 1); return new string(chars); }
3、CopyTo方法
這個(gè)方法相信大家應(yīng)該有點(diǎn)影響,我們前面的文章也有提到過。簡(jiǎn)單來(lái)說(shuō)就是把原數(shù)組復(fù)制到目標(biāo)數(shù)組中,代碼如下:
public static string ArrayCopyTo(string source) { var chars = new char[source.Length - 1]; source.CopyTo(0, chars, 0, chars.Length); return new string(chars); }
4、String方式
String方式是值當(dāng)把原字符串轉(zhuǎn)換為字符數(shù)組后,直接使用String構(gòu)造方法從字符數(shù)組中指定位置處開始并指定長(zhǎng)度,來(lái)獲取我們想要的結(jié)果。代碼如下:
public static string ArrayString(string source) { var chars = source.ToCharArray(); return new string(chars, 0, chars.Length - 1); }
其中字符串構(gòu)造函數(shù)第一個(gè)參數(shù)表示字符數(shù)組,第二個(gè)參數(shù)表示從字符數(shù)組第0個(gè)索引開始,第三個(gè)參數(shù)表示取字符數(shù)組的元素個(gè)數(shù)。
5、小結(jié)
同樣對(duì)上面四種方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過測(cè)試結(jié)果不難發(fā)現(xiàn),CopyTo方法和String方式相對(duì)較好,比之StringBuilder方式還要好些。
04、第四類、Linq方式
Linq方式的核心思想是通過Linq方法獲取目標(biāo)字符串對(duì)應(yīng)的字符數(shù)組,然后再轉(zhuǎn)為字符串返回。
1、Take方法
Take方法主要作用是從序列的開頭返回指定數(shù)目的連續(xù)元素,因此代碼實(shí)現(xiàn)如下:
public static string LinqTake(string source) { return new string(source.Take(source.Length - 1).ToArray()); }
2、SkipLast方法
SkipLast方法是從C# 8才開始有的,其作用是返回集合排除最后指定個(gè)數(shù)的元素外的所有元素。
public static string LinqSkipLast(string source) { return new string(source.SkipLast(1).ToArray()); }
3、Range + Select方法
Range方法相信大家用的也比較少,其作用是生成指定范圍內(nèi)的整數(shù)序列。我們先來(lái)看代碼然后再做解釋:
public static string LinqRange(string source) { return new string(Enumerable.Range(0, source.Length - 1).Select(i => source[i]).ToArray()); }
這里Range方法相當(dāng)于生成了目標(biāo)字符串索引序列,即[0.. source.Length - 1],然后再通過Seletc方法取原字符串相應(yīng)的字符,最后得到結(jié)果。
4、小結(jié)
同樣對(duì)上面三種方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過測(cè)試結(jié)果不難發(fā)現(xiàn),Range + Select方法相對(duì)較好,但是比之前幾類方法就差的太遠(yuǎn)了。
05、第五類、Linq + String組合方式
這類方法是通過Linq方法和字符串方法組合的方式實(shí)現(xiàn)。
1、Concat方法
Concat方法是字符串的靜態(tài)方法可以連接多個(gè)字符成為一個(gè)新的字符串,然后通過Linq的SkipLast方法配合達(dá)到我們的目的,代碼如下:
public static string LinqStringConcat(string source) { return string.Concat(source.SkipLast(1)); }
2、Join方法
Join方法也是字符串的靜態(tài)方法,主要作用是使用指定的分隔符連接集合的成員。因此也可以達(dá)到Concat類似的效果。
public static string LinqStringJoin(string source) { return string.Join("", source.SkipLast(1)); }
3、小結(jié)
下面我們對(duì)兩個(gè)方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過這組測(cè)試結(jié)果說(shuō)明兩者相差不大,相對(duì)于之前的方法更差了。
06、第六類、數(shù)據(jù)視圖方式
數(shù)據(jù)視圖方式的核心思想是通過Span、Memory和ArraySegment實(shí)現(xiàn)。
1、AsSpan方法
Span是一個(gè)輕量級(jí)的、非托管的視圖,用于表示連續(xù)的內(nèi)存塊。它可以直接操作棧上的內(nèi)存。AsSpan方法可以通過指定起始索引和長(zhǎng)度,直接在原字符串上獲取到目標(biāo)字符串視圖,然后轉(zhuǎn)成字符串返回,代碼實(shí)現(xiàn)如下:
public static string Span(string source) { var span = source.AsSpan(0, source.Length - 1); return new string(span); }
2、AsMemory方法
Memory也是一個(gè)內(nèi)存視圖,但與 Span 不同,它可以存儲(chǔ)在 heap 上。AsMemory方法用法和AsSpan方法類似,代碼如下:
public static string Memory(string source) { var memory = source.AsMemory(0, source.Length - 1); return new string(memory.Span); }
3、ArraySegment方法
ArraySegment封裝了對(duì)數(shù)組的一部分的引用,并維護(hù)了該部分的起始位置和長(zhǎng)度。
public static string ArraySegment(string source) { var segment = new ArraySegment<char>(source.ToCharArray(), 0, source.Length - 1); return new string(segment.Array, segment.Offset, segment.Count); }
4、小結(jié)
同樣對(duì)上面三種方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過測(cè)試結(jié)果可以發(fā)現(xiàn),三種方法性能都是相當(dāng)高,當(dāng)然其中ArraySegment方法相對(duì)要差一些??偨y(tǒng)來(lái)說(shuō)數(shù)據(jù)視圖方式已經(jīng)和第一類字符串方式不相上下了。
07、第七類、正則表達(dá)式方式
這里解釋兩種正則表達(dá)式實(shí)現(xiàn)的方法。
1、Replace方法
Replace方法是Regex的靜態(tài)方法,代碼如下:
public static string RegexReplace(string source) { return Regex.Replace(source, ".$", ""); }
2、Match方法
Match方法也是Regex的靜態(tài)方法,代碼如下:
public static string RegexMatch(string source) { var match = Regex.Match(source, @"^(.*).$"); return match.Groups[1].Value; }
3、小結(jié)
下面我們對(duì)兩個(gè)方法進(jìn)行三組對(duì)比性能測(cè)試,每組分別為長(zhǎng)度為100、1000、10000的字符串。
通過這組測(cè)試結(jié)果說(shuō)明兩者相差不大,相對(duì)于之前的方法性能差別居中。
從整體來(lái)看,使用第一類字符串方式性能又高代碼又簡(jiǎn)潔是最優(yōu)選,而列舉了那么多種方法主要目的還是熟悉一些基礎(chǔ)方法,雖然在這個(gè)案例里不是最優(yōu)解,但是說(shuō)不定在其他地方就用的恰到好處。
我們都知道做同樣一件事件可能有很多種方法,然后可以選擇出一種最優(yōu)的方法,但是這個(gè)前提是你要知道這些方法是什么,你才能有的選。
注:測(cè)試方法代碼以及示例源碼都已經(jīng)上傳至代碼庫(kù),有興趣的可以看看。https://gitee.com/hugogoos/Planner
到此這篇關(guān)于.net core 基礎(chǔ) - 刪除字符串最后一個(gè)字符的七大類N種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān).net core 基礎(chǔ) - 刪除字符串最后一個(gè)字符的七大類N種實(shí)現(xiàn)方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
請(qǐng)求如何進(jìn)入ASP.NET MVC框架
這篇文章主要介紹了請(qǐng)求如何進(jìn)入ASP.NET MVC框架的實(shí)現(xiàn)過程,感興趣的小伙伴們可以參考一下2016-04-04asp.net上傳圖片并作處理水印與縮略圖的實(shí)例代碼
asp.net 上傳圖片并作處理(生成縮略圖 、在圖片上增加文字水印、在圖片上生成圖片水?。┑膶?shí)例代碼,經(jīng)過測(cè)試!2013-06-06asp.net使用AJAX實(shí)現(xiàn)無(wú)刷新分頁(yè)
AJAX(Asynchronous JavaScript and XML)是一種進(jìn)行頁(yè)面局部異步刷新的技術(shù)。用AJAX向服務(wù)器發(fā)送請(qǐng)求和獲得服務(wù)器返回的數(shù)據(jù)并且更新到界面中,不是整個(gè)頁(yè)面刷新,而是在頁(yè)面中使用Js創(chuàng)建XMLHTTPRequest對(duì)象來(lái)向服務(wù)器發(fā)出請(qǐng)求以及獲得返回的數(shù)據(jù)。2014-11-11ASP.NET中URL Rewrite的具體實(shí)現(xiàn)方法
這篇文章介紹了ASP.NET中URL Rewrite的具體實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-11-11ASP.NET筆記之頁(yè)面跳轉(zhuǎn)、調(diào)試、form表單、viewstate、cookie的使用說(shuō)明
ASP.NET筆記之頁(yè)面跳轉(zhuǎn)、調(diào)試、form表單、viewstate、cookie的使用說(shuō)明2013-04-04Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能
這篇文章主要介紹了Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12ASP.NET MVC5網(wǎng)站開發(fā)管理列表、回復(fù)及刪除(十三)
這篇文章主要介紹了ASP.NET MVC5網(wǎng)站開發(fā)實(shí)現(xiàn)管理列表、回復(fù)及刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09