精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#.net core 基礎 - 刪除字符串最后一個字符的七大類N種實現(xiàn)方式以及性能測試

freeflydom
2024年12月20日 9:49 本文熱度 899

01、第一類、字符串方式

這類方法是通過string類型自身方法直接實現(xiàn)。

1、Substring方法

相信大多數(shù)人第一個想到的可能就是這個方法。Substring方法是字符串內(nèi)置方法,可以通過指定起始索引位置為0以及長度為字符串長度減1,直接截取指定長度的子字符串,從而達到刪除最后一個字符目的。

示例代碼如下:

public static string StringSubstring(string source){
    return source.Substring(0, source.Length - 1);
}

2、范圍運算符

這個方法可以說是最簡潔的方法,可能大家用的不是很多。范圍運算符是從C# 8開始支持的。它的形式如:variate[start..end],指定某一索引范圍的開頭和末尾作為其操作數(shù)。左側(cè)操作數(shù)是范圍的包含性開頭。右側(cè)操作數(shù)是范圍的不包含性末尾。任一操作數(shù)都可以是序列開頭或末尾的索引。

下面列舉了表達集合范圍的各種方法:

范圍運算符也適用于字符串,實現(xiàn)代碼如下:

public static string StringRangeOperator(string source){
    return source[..^1];
}

3、Remove方法

Remove方法是字符串內(nèi)置方法,可以刪除從指定起始索引位置起到結(jié)尾的所有字符,因此可以把起始索引定為最后一個字符,從而達到刪除最后一個字符目的。

示例代碼如下:

public static string StringRemove(string source){
    return source.Remove(source.Length - 1);
}

4、Create方法

Create方法是字符串的靜態(tài)方法,這個方法相信大家用的比較少,其作用是創(chuàng)建一個具有特定長度的新字符串,并在創(chuàng)建后使用指定的回調(diào)對其進行初始化。下面我們直接看下實現(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];
        }
    });
}

下面對上面代碼做個簡單解釋,第一個參數(shù)source.Length - 1是創(chuàng)建比原字符串長度少1位的目標字符串;第二個參數(shù)source是把原字符串當作參數(shù)傳入,用于給第三個參數(shù)使用;第三個參數(shù)是一個兩個參數(shù)無返回值委托,其中span參數(shù)表示目標字符串對應的Span,state參數(shù)表示原字符串即第二個參數(shù)值,for循環(huán)即是把原字符串字符循環(huán)賦值給目標字符串。

5、小結(jié)

上面四種方法主要是使用了字符串自身的內(nèi)置方法進行操作,下面我們對四個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過測試結(jié)果不難發(fā)現(xiàn),除了Create方法,其他三個方法差別不大,綜合來看可以說Remove最優(yōu)。

02、第二類、StringBuilder方式

如果需要對大量字符串操作,相信大家會立即想到用StringBuilder來進行性能優(yōu)化,下面簡單介紹兩種使用StringBuilder方式來刪除字符串最后一個字符。

1、Append方法

字符串就相當于字符數(shù)組,因此我們可以循環(huán)字符串,然后使用StringBuilder的Append方法進行拼接,實現(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方式

相信大家看到這個標題應該比較疑惑,這是什么意思,我們先看代碼再講解:

public static string StringBuilderLength(string source){
    var sb = new StringBuilder(source);
    sb.Length--;
    return sb.ToString();
}

首先第一行代碼表示通過原字符串創(chuàng)建一個可變字符串;重點就在第二行,直接對StringBuilder長度執(zhí)行減1操作;最后再把StringBuilder轉(zhuǎn)為字符串返回。

首先StringBuilder的Length屬性表示當前可變字符串包含的字符數(shù),當對其進行減1操作時,相當于告訴StringBuilder對象忽略最后一個字符,其內(nèi)部并沒有真的刪除任何字符,被忽略的字符仍包含再StringBuilder對象內(nèi)部,只是不再將其視為字符串的一部分,因此在調(diào)用.ToString方法時返回的就是我們想要的字符串。

3、小結(jié)

下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過這組測試結(jié)果很容易發(fā)現(xiàn),直接操作Length屬性性能顯著優(yōu)越于Append方法,但是和字符串直接操作的方式相比還差了不少。

03、第三類、Array方式

上面我們提到字符串相當于字符數(shù)組,因此我們可以直接使用數(shù)組相應的方法。

1、For方法

我們可以直接構(gòu)建一個目標字符數(shù)組,然后把原字符串中相應的字符復制到新字符數(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 方法

這個方法大家可能用的比較少,它可以把數(shù)組元素個數(shù)更改為指定的大小。其思想有點像上面StringBuilder對象直接修改Length屬性。下面直接看看代碼:

public static string ArrayResize(string source){
    var chars = source.ToCharArray();
    Array.Resize(ref chars, chars.Length - 1);
    return new string(chars);
}

3、CopyTo方法

這個方法相信大家應該有點影響,我們前面的文章也有提到過。簡單來說就是把原數(shù)組復制到目標數(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方式是值當把原字符串轉(zhuǎn)換為字符數(shù)組后,直接使用String構(gòu)造方法從字符數(shù)組中指定位置處開始并指定長度,來獲取我們想要的結(jié)果。代碼如下:

public static string ArrayString(string source){
    var chars = source.ToCharArray();
    return new string(chars, 0, chars.Length - 1);
}

其中字符串構(gòu)造函數(shù)第一個參數(shù)表示字符數(shù)組,第二個參數(shù)表示從字符數(shù)組第0個索引開始,第三個參數(shù)表示取字符數(shù)組的元素個數(shù)。

5、小結(jié)

同樣對上面四種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過測試結(jié)果不難發(fā)現(xiàn),CopyTo方法和String方式相對較好,比之StringBuilder方式還要好些。

04、第四類、Linq方式

Linq方式的核心思想是通過Linq方法獲取目標字符串對應的字符數(shù)組,然后再轉(zhuǎn)為字符串返回。

1、Take方法

Take方法主要作用是從序列的開頭返回指定數(shù)目的連續(xù)元素,因此代碼實現(xiàn)如下:

public static string LinqTake(string source){
    return new string(source.Take(source.Length - 1).ToArray());
}

2、SkipLast方法

SkipLast方法是從C# 8才開始有的,其作用是返回集合排除最后指定個數(shù)的元素外的所有元素。

public static string LinqSkipLast(string source){
    return new string(source.SkipLast(1).ToArray());
}

3、Range + Select方法

Range方法相信大家用的也比較少,其作用是生成指定范圍內(nèi)的整數(shù)序列。我們先來看代碼然后再做解釋:

public static string LinqRange(string source){
    return new string(Enumerable.Range(0, source.Length - 1).Select(i => source[i]).ToArray());
}

這里Range方法相當于生成了目標字符串索引序列,即[0.. source.Length - 1],然后再通過Seletc方法取原字符串相應的字符,最后得到結(jié)果。

4、小結(jié)

同樣對上面三種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過測試結(jié)果不難發(fā)現(xiàn),Range + Select方法相對較好,但是比之前幾類方法就差的太遠了。

05、第五類、Linq + String組合方式

這類方法是通過Linq方法和字符串方法組合的方式實現(xiàn)。

1、Concat方法

Concat方法是字符串的靜態(tài)方法可以連接多個字符成為一個新的字符串,然后通過Linq的SkipLast方法配合達到我們的目的,代碼如下:

public static string LinqStringConcat(string source){
    return string.Concat(source.SkipLast(1));
}

2、Join方法

Join方法也是字符串的靜態(tài)方法,主要作用是使用指定的分隔符連接集合的成員。因此也可以達到Concat類似的效果。

public static string LinqStringJoin(string source){
    return string.Join("", source.SkipLast(1));
}

3、小結(jié)

下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過這組測試結(jié)果說明兩者相差不大,相對于之前的方法更差了。

06、第六類、數(shù)據(jù)視圖方式

數(shù)據(jù)視圖方式的核心思想是通過Span、Memory和ArraySegment實現(xiàn)。

1、AsSpan方法

Span是一個輕量級的、非托管的視圖,用于表示連續(xù)的內(nèi)存塊。它可以直接操作棧上的內(nèi)存。AsSpan方法可以通過指定起始索引和長度,直接在原字符串上獲取到目標字符串視圖,然后轉(zhuǎn)成字符串返回,代碼實現(xiàn)如下:

public static string Span(string source){
    var span = source.AsSpan(0, source.Length - 1);
    return new string(span);
}

2、AsMemory方法

Memory也是一個內(nèi)存視圖,但與 Span 不同,它可以存儲在 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封裝了對數(shù)組的一部分的引用,并維護了該部分的起始位置和長度。

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é)

同樣對上面三種方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過測試結(jié)果可以發(fā)現(xiàn),三種方法性能都是相當高,當然其中ArraySegment方法相對要差一些。總統(tǒng)來說數(shù)據(jù)視圖方式已經(jīng)和第一類字符串方式不相上下了。

07、第七類、正則表達式方式

這里解釋兩種正則表達式實現(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é)

下面我們對兩個方法進行三組對比性能測試,每組分別為長度為100、1000、10000的字符串。

通過這組測試結(jié)果說明兩者相差不大,相對于之前的方法性能差別居中。

從整體來看,使用第一類字符串方式性能又高代碼又簡潔是最優(yōu)選,而列舉了那么多種方法主要目的還是熟悉一些基礎方法,雖然在這個案例里不是最優(yōu)解,但是說不定在其他地方就用的恰到好處。

我們都知道做同樣一件事件可能有很多種方法,然后可以選擇出一種最優(yōu)的方法,但是這個前提是你要知道這些方法是什么,你才能有的選。

:測試方法代碼以及示例源碼都已經(jīng)上傳至代碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Planner

轉(zhuǎn)自https://www.cnblogs.com/hugogoos/p/18453906


該文章在 2024/12/20 9:51:16 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結(jié)合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国模娜娜一区二区三区 | 综合精品视频天天搞天天操 | 久久久无码精品亚洲日韩啪啪网站 | 中文字幕久久久久久精品 | 免费av一区二区三区 | 国产三级不卡在线播放 | 精品欧美一区二区三区久久久 | 日本人妻精品免费视频 | 亚洲经典千人经典日产 | 一区二区三区在线观看国产 | 香蕉影视色多多 | 91无码人区精品一区二区三区 | 99久久久无码国产精品性 | 欧美成人国产一区二 | 亚洲av综合伊人av一区加勒比 | 人妻中文字幕有码在线 | 偷拍精品视频一区二区三区 | 工口里番外番全彩无遮挡 | 豪妇荡乳1一5白玉兰免费下载 | 精品无码制服丝袜日韩视频 | 亚洲国产精品久久久久婷蜜芽 | 亚洲老妇色熟女老太 | 无码精品一二三四区A片 | 精品国产乱码久久久久久口爆 | 亚洲精品ⅴ中文字幕乱码 | 久久久久亚洲av片无码v | 欧美日韩国产在线成人网 | 亚州免费一级毛片 | 日韩欧美一区黑人vs日本人 | 人妻女警官痴汉电车在线 | 亚洲va久久久噜噜噜久久 | 无码专区aaaaaa免费视频 | 国产成人无码精品久久久小说 | 人妻夜夜爽天天爽三 | 国产成人久久精品麻豆二区33 | 日韩av日韩无码电影网站 | 夂久精品国产久精国产 | av香港经典三级级 在线 | 色情无码WWW视频无码区下载 | 伊人无码高清 | 国产成人一区二区青青草原 |