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