1. 程式人生 > >C# 基礎知識系列- 9 字串的更多用法(二)

C# 基礎知識系列- 9 字串的更多用法(二)

0. 前言

上一篇文章介紹了字串自身的一些方法,就是物件方法。在字串體系中,還有一些是string類提供的靜態方法。這兩部分構成了字串體系,當然還有一些三方庫為字串提供了擴充套件方法。
這裡簡單的介紹一下string類的靜態方法。

1. 玩轉建立字串

1.1 Create一個字串

通過呼叫string.Create方法可以生成一個字串。該方法的宣告是

public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);

簡單的來講就是生成一個長度為length

的字串,基本元素是 TState型別的state,具體的填充過程交由action來進行處理。值得注意的是action是一個委託,也就是它可以用lambda表示式直接使用,具體宣告如下:

public delegate void SpanAction<T,in TArg>(Span<T> span, TArg arg);

因為方法中指定了Span引數為char,那麼 action 的寫法應該如下:

(span, state)=>//span 的型別是 Span<char>,state的型別是 TState
{
// 注意,沒有返回值
}

示例:

string str = "12320kz,zxcqweqwkuqwiqewpqwwe";
Console.WriteLine(string.Create(10,str, (span, c) =>
{
    span.Fill(c[0]);
}));

span的方法Fill的引數是char,所以這個方法就是按照一定邏輯將 state引數轉換成char然後填充給字串,在action中多次呼叫Fill只會生效最後一次填充。

1.2 連線多個元素

字串的連線有兩個方法,一個是string.Concat,一個是string.Join

首先介紹Concat,這個方法最基本的功能就是將多個字串收尾連線成一個字串,繼續引申,連線任意個物件形成一個字串,最後將一個集合的元素拼接成字串。所以,這個方法的宣告就有以下內容:

public static string Concat (string str0, string str1);
public static string Concat (object arg0, object arg1);
public static string Concat (params string[] values);
public static string Concat (params object[] args);
public static string Concat (System.Collections.Generic.IEnumerable<string> values);
public static string Concat<T> (System.Collections.Generic.IEnumerable<T> values);

以上只是幾個具有代表性的方法,介紹到這裡有沒有覺得它的實現很眼熟?

沒錯,字串的‘加法’運算就是基於這個方法實現的。

Join在行為上與Concat很相似,但是這個方法是用一個分割符(可以是字串)將一組物件連線起來,所以它的宣告就是如下內容:

public static string Join (char separator, params object[] values);
public static string Join<T> (char separator, System.Collections.Generic.IEnumerable<T> values);
public static string Join (string separator, params object[] values);
public static string Join<T> (string separator, System.Collections.Generic.IEnumerable<T> values);

這兩個方法出鏡率非常高,不過Concat更多的是用‘加法’形式,而Join在多個元素快速生成字串中非常常見。

這裡簡單介紹一下Join的使用:

var list = new List<int>();
for (var i = 0; i < 10; i++)
{
    list.Add(i);// 生成一個列表,元素是0到9這十個數字
}
string str = string.Join(",", list);//0,1,2,3,4,5,6,7,8,9

2. 快來比一比

2.1 我們是不是同一個

因為字串機制的問題,所以一般字串的相等性比較分為了兩種,字面相等性和引用相等性。在C#中預設的相等性比較是字面值相等性。示例:

string str1 = "123";
string str2 = "123";
string str3 = new string("123");
bool eq1 = str1 == str2;// true
bool eq2 = str2 == str3;// true
bool eq3 = str1 == str3;// true

那麼如何判斷是否是同一個引用呢?通過object.ReferenceEquals來判斷是否是同一個引用。繼續上面的例子:

bool req1 = object.ReferenceEquals(str1, str2);// true
bool req1 = object.ReferenceEquals(str2, str3);// false
bool req3 = object.ReferenceEquals(str1, str3);// false

在C#中,編譯器會將一樣字面值的字串指向同一個地址,這個地址是在字串的常量池中。而使用new等方法建立的字串,是在程式執行後才會確認字串具體的值,所以這個地址是後分配的。所以上述兩種判斷方式會出現不同的結果。

string類提供了一個靜態方法Equals,方法宣告如下:

public static bool Equals (string a, string b);
public static bool Equals (string a, string b, StringComparison comparisonType);

該方法返回兩個字串是否是相等的,也就是與字串預設的==判斷是一致的。

2.2 來比一比高矮

在我們開發的過程中經常會遇到對字串進行排序的需求,那麼字串排序的邏輯是什麼呢?

對於數字、字母來說是按照ASCII碼進行排序的,也就是數字、小寫、大寫字母這樣進行排序。當加入中文後,中文排最後,同種字元按字典順序進行排序。對於一些跨語言的排序會因為語言不同而導致排序結果不一樣。這裡有興趣的可以檢視一下微軟的官方文件。

介紹一下字串排序的基本方法:Compare

這個方法有一個物件的相似方法是CompareTo,這個方法是IComparable介面定義的方法,與這個方法行為一致。該方法常用的有如下幾個定義:

public static int Compare (string strA, string strB);
public static int Compare (string strA, string strB, StringComparison comparisonType);

這個方法返回一個整型,可以理解為兩個字串之間的距離,正的表示A在B的後面,負的表示A在B的前面。值的絕對值越大,兩個字串之間的距離也越大,但是值本身不具備意義。如果值為0,則表示這兩個字串相等。

有一個過載版本里有個引數型別是StringComparison,這是一個列舉型別,用來定義在比較兩個字串時的一些行為,後續有機會詳細介紹這一部分。

示例:

string str1 = "123a";
string str2 = "132a";
int position1 = string.Compare(str1, str2);// -1
str1 = "你好";
str2 = "我們";
int position2 = string.Compare(str1, str2);// -1

可以明顯看出,排序規則基本就是字典順序。

3. 補充

補充三個上一篇文章遺漏的方法,插入、刪除、獲取一個子串。

3.1 插入到某個位置

public string Insert (int startIndex, string value);

在源字串指定的位置插入一個字串並返回插入的結果。

3.2 刪除

//從startIndex開始,後面的所有元素都刪除,包括startIndex,返回剩下的字元
public string Remove (int startIndex);
//從startIndex開始,刪除 count個元素,返回剩下的字元
public string Remove (int startIndex, int count);

3.3 獲取一個子串

// 返回從startIndex開始,剩下的的元素,包括startIndex
public string Substring (int startIndex);
// 返回從startIndex開始,一共count個元素的字串,包括startIndex
public string Substring (int startIndex, int length);

這一部分的方法比較簡單,就不做示例演示了。不過需要注意的是 所有引數都應該是大於0的,且不能大於字串的長度,包括 startIndex+count。

4. 總結

目前為止,字串的常規使用已經完成了,但是字串的使用卻並沒有結束,後續會繼續介紹C#其他內容,其中有幾個內容是與字串有很大的關聯的,這裡先容我賣個關子。

更多內容煩請關注我的部落格

相關推薦

C# 基礎知識系列- 10 反射和泛型

0. 前言 這篇文章延續《C# 基礎知識系列- 5 反射和泛型》,繼續介紹C#在反射所開發的功能和做的努力。上一篇文章大概介紹了一下泛型和反射的一些基本內容,主要是通過獲取物件的型別,然後通過這個型別物件操作物件。這一篇介紹一個在反射中很重要的內容:特性,以及上一篇未完成的內容——泛型在反射中的引用。 1.

C# 基礎知識系列- 13 常見類庫介紹日期時間類

# 0. 前言 上一篇內容介紹了Console類和Math類,這篇內容著重介紹一下C#中時間日期的處理方式。 > 上一篇勘誤: 上一篇中關於靜態類沒有建構函式,這一表述有誤。正確的說法是C#中靜態類不包含常規建構函式,但可以新增一個靜態建構函式。 > 靜態建構函式與普通普通建構函式的區別是,靜態

C# 基礎知識系列- 9 字串用法

0. 前言 上一篇文章介紹了字串自身的一些方法,就是物件方法。在字串體系中,還有一些是string類提供的靜態方法。這兩部分構成了字串體系,當然還有一些三方庫為字串提供了擴充套件方法。 這裡簡單的介紹一下string類的靜態方法。 1. 玩轉建立字串 1.1 Create一個字串 通過呼叫string.Cre

C# 基礎知識系列- 13 常見類庫介紹

0. 前言 每篇一個前言,介紹一下這一篇的內容。之前的內容都是針對某些知識點進行的介紹,這篇內容介紹一下實際開發中常用的一些類和名稱空間。這一篇是個連續劇,大概有個三四集。嗯,就是這樣。 1. System 名稱空間 System空間,是C#的基礎名稱空間,裡面定義了常用值和資料型別以及各種型別的基類,當然也

C# 基礎知識系列- 12 任務和執行緒

0. 前言 照例一份前言,在介紹任務和多執行緒之前,先介紹一下非同步和同步的概念。我們之間介紹的知識點都是在同步執行,所謂的同步就是一行程式碼一行程式碼的執行,就像是我們日常乘坐地鐵通過安檢通道一樣,想象我們每個人都是一行程式碼,我們依次通過安檢儀器的時候就是同步。 那麼,什麼是非同步呢?有一個時間利用率的故

C#基礎知識-面向對象思想之繼承

添加 電視劇 一中 一段 public bsp 更多 cnblogs tin 上一篇的標題編程思想我覺得不是很符合主題,因為編程思想的範圍太大了,不僅僅是封裝 繼承 多態,所以比較符合主題的應該是面向對象思想。這一篇中將繼續敘述面向對象思想中的繼承。 從字面來看繼承表達的意

C#進階系列——DDD領域驅動設計初探:倉儲Repository

前言:上篇介紹了DDD設計Demo裡面的聚合劃分以及實體和聚合根的設計,這章繼續來說說DDD裡面最具爭議的話題之一的倉儲Repository,為什麼Repository會有這麼大的爭議,博主認為主要原因無非以下兩點:一是Repository的真實意圖沒有理解清楚,導致設計的紊亂,隨著專案的橫向和縱向擴充套件,

C++開源矩陣計算工具——Eigen的簡單用法

本文主要是Eigen中矩陣和向量的算術運算,在Eigen中的這些算術運算過載了C++的+,-,*,所以使用起來非常方便。1、矩陣的運算Eigen提供+、-、一元操作符“-”、+=、-=,例如:二元操作符+/-表示兩矩陣相加(矩陣中對應元素相加/減,返回一個臨時矩陣): B+C

[C# 基礎知識系列] 專題十五:全面解析擴充套件方法

引言:    C# 3中所有特性的提出都是更好地為Linq服務的, 充分理解這些基礎特性後。對於更深層次地去理解Linq的架構方面會更加簡單,從而就可以自己去實現一個簡單的ORM框架的,對於Linq的學習在下一個專題中將會簡單和大家介紹下,這個專題還是先來介紹服務於Li

[C#基礎知識系列]專題十:全面解析可空型別

引言:   C# 2.0 中還引入了可空型別,可空型別也是值型別,只是可空型別是包括null的值型別的,下面就介紹下C#2.0中對可空型別的支援具體有哪些內容(最近一直都在思考如何來分享這篇文章的,因為剛開始覺得可空型別使用過程中比較簡單,覺得沒有講的必要,但是考慮到這

[C#基礎知識系列]專題十:迭代器

引言:    在C# 1.0中我們經常使用foreach來遍歷一個集合中的元素,然而一個型別要能夠使用foreach關鍵字來對其進行遍歷必須實現IEnumerable或IEnumerable<T>介面,(之所以來必須要實現IEnumerable這個介面,是因

C# 基礎知識系列- 3 集合陣列

簡單的介紹一下集合,通俗來講就是用來保管多個數據的方案。比如說我們是一個公司的倉庫管理,公司有一堆貨物需要管理,有同類的,有不同類的,總而言之就是很多、很亂。我們對照集合的概念對倉庫進行管理的話,那麼 陣列就是將一堆貨整整齊齊的碼在倉庫的某個地方,普通列表也是如此;Set就是在倉庫裡有這麼一個貨架,每種貨品

C# 基礎知識系列- 4 面向物件

# 面向物件 面向物件是一個抽象的概念,其本質就是對事物以抽象的方式建立對應的模型。 簡單來講,比如我有一隻鋼筆,那麼我就可以通過分析,可以得到 這隻鋼筆的材第是塑料,品牌是個雜牌 ,裡面裝的墨是黑色的,可以用。這時候就能建立一個鋼筆的模型,它在這裡應該有這些屬性: ![file](https://img

C# 基礎知識系列- 14 IO篇 檔案的操作

> 本篇繼續前兩篇內容,跟大家介紹一下Path類以及FileSystemInfo這個類的主要方法和屬性。 > > 上文提到,在《C# 基礎知識系列-IO篇》之檔案相關的內容完結之後,會帶領大家開發一個小工具-快速檢索檔案所在目錄。 ## 1.3. Path Path的中文名稱有路徑的

C# 基礎知識系列- 14 IO篇 流的使用

# 0. 前言 繼續之前的C# IO流,在前幾篇小短片中我們大概看了下C# 的基礎IO也對檔案、目錄和路徑的操作有了一定的瞭解。這一篇開始,給大家演示一下流的各種操作。以檔案流為例,一起來看看如何操作吧。 > 注:之前更新了一篇《Spring Cloud 實戰日記》,這是一個新的系列,有興趣的小夥伴

C# 基礎知識系列- 17 實戰篇 編寫一個小工具1

# 0. 前言 這是對C# 基礎系列的一個總結,現在我們利用之前學到的知識做一個小小的工具來給我們使用。 如果有看過IO篇的小夥伴,應該有印象。當時我提過一個場景描述,我們在平時使用系統的時候,經常會為了找某個檔案的位置而煩惱。那麼我們現在嘗試寫一個控制檯程式來幫助我們找檔案的具體位置。 # 1. 分析

C# 基礎知識系列- 17 小工具優化

# 0. 前言 不知道有沒有動手能力強的小夥伴照著上一篇的內容寫過程式呢?如果有的話,應該會在使用的時候發現以下幾個問題: 1. 每次啟動都需要經過漫長的時間去遍歷磁盤裡的檔案目錄 2. 因為資料是用的字典儲存的,所以會消耗大量的記憶體空間 3. 不能多次查詢 現在我們就針對這些問題,讓我們的小工具實用

c++知識歸納】繼承與

        c++是基於面向物件的程式語言,面向物件的三大特性為:封裝、繼承和多型。本文對繼承與多型的知識點進行了總結歸納,這部分內容對於學習c++程式語言是非常重要的,文章加入我的個人理解,希望

C#進階系列——WebApi 異常處理解決方案

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

java基礎知識學習--------之枚舉類型1

blog 枚舉類型 csdn 相同 名稱 枚舉類 java string pac 枚舉類型的概念: 1 /** 2 * 目的:枚舉類型 3 * @author chenyanlong 4 * 日期:2017/10/22 5 * 網址:http://blo