C#中的char和string的使用簡介

NanKingQG發表於2020-07-18

char 字元

char代表一個Unicode字元,它是System.Char的別名

char someChar = 'a';//定義了一個字元
char newLine= '\n';//這是一個換行符

 

System.Char定義了一組靜態方法:

  • ToUpper 將指定的字元轉換為等效的大寫形式
  • ToLower 將指定的字元轉換為等效的小寫形式
  • IsWhiteSpace 判斷指定的字元是否為空白字元
  • ……

例子:

Console.WriteLine(char.ToUpper('c'));//輸出的是一個大寫的C
Console.WriteLine(char.ToLower('c'));//輸出的是還是它自己
Console.WriteLine(char.ToUpper('C'));//輸出的是還是它自己
Console.WriteLine(char.ToLower('C'));//輸出的是一個小寫的c
Console.WriteLine(char.IsWhiteSpace('c'));//輸出為False
Console.WriteLine(char.IsWhiteSpace('\t'));//輸出為True
Console.WriteLine(char.IsWhiteSpace(' '));//輸出為True

可以通過char或者System.Char來呼叫

例子:

Console.WriteLine(char.ToUpper('c'));//輸出的是一個大寫的C
Console.WriteLine(System.Char.ToUpper('c'));//輸出的是一個大寫的C

現在這邊會有一個問題,可能會引起一個bug,就是ToUpper,ToLower會遵循使用者的地區設定,例如,char.ToUpper('i') == 'I',這句話在土耳其地區設定裡就會返回False。

culture-invariant版本的方法

總會應用英語的Culture

  • ToUpperInvariant
  • ToLowerInvariant

例子:

//使用固定區域性的大小寫規則,不依賴於區域性的設定
Console.WriteLine(char.ToUpperInvariant('i'));//輸出的是大寫的I
Console.WriteLine(char.ToUpper('i', CultureInfo.InvariantCulture));

 

char是16bit的,足夠代表基本多語言平面的任何Unicode字元,如果超出這個範圍,那麼必須使用surrogate pairs。

 

string 字串

  • string是System.String的別名
  • string是不可變的
  • string是字元的序列

如何構建string

例子:

string s1 = "Hello";
string s2 = "First Line\r\nSecond Line";
string s3 = @"\\server\fileshare\helloworld.cs";
  • 建立重複字元的字串,例子
Console.WriteLine(new string('*', 10));//輸出的結果就是**********

使用string的建構函式建立一個重複指定次數的字元的字串

  • 可以從char陣列構建字串,例子
char[] ca = "Hello".ToCharArray();
string s = new string(ca);

ToCharArray的作用正好相反

  • string的建構函式也被過載用來接收各種(不安全的)指標型別,目的是從像char*這樣的型別建立字串。

Null 和 空string

  • 空string的長度是0

通過literal或string.Empty靜態欄位來建立

相等性比較的例子:

string empty = "";
Console.WriteLine(empty == ""); // True
Console.WriteLine(empty == string.Empty); // True
Console.WriteLine(empty.Length == 0); // True
  • string可以為null,因為是引用型別
string nullString = null;
Console.WriteLine(nullString == null); // True
Console.WriteLine(nullString == ""); // False
Console.WriteLine(nullString.Length == 0); // NullReferenceException

靜態的string.IsNullOrEmpty通常用來判斷字串是否為空或者null

 

訪問string裡的字元

  • 通過索引器
string str = "abcd";
char letter = str[1]; // letter = 'b'
  • string實現了IEnumerable<char>介面,所以可以foreach裡面的插入元素
// 分別依次輸出字元1 、2 、3
foreach (var item in "123")
{
    Console.WriteLine(item);
}

 

在string裡進行搜尋

最簡單的方法包括:StartsWith,EndsWith和Contains。返回的是true或者false。

Console.WriteLine("HelloWorld.cs".EndsWith(".cs")); // 返回結果為True
Console.WriteLine("HelloWorld.cs".Contains("World")); // 返回結果為True
Console.WriteLine("HelloWorld.cs".EndsWith(".CS")); // 返回結果為False
Console.WriteLine("HelloWorld.cs".Contains("world")); // 返回結果為False

StartsWith,EndsWith的過載方法允許你指定一個StringComparison列舉或一個CultureInfo物件,以便控制大小寫和區域文化的敏感性,預設使用當前本地化的區域設定(locale),並且區分大小寫。

Console.WriteLine("HelloWorld.cs".StartsWith("hello", StringComparison.InvariantCultureIgnoreCase)); // 返回結果為True

Contains沒有提供類似的過載方法,但是你可以使用IndexOf方法,它會返回給定字元/子字串在被搜尋字串裡的首個位置。

同時,IndexOf提供了過載方法,它可以接收一個起始位置引數(開始搜尋的索引值),以及一個StringComparison列舉

Console.WriteLine("abcde".IndexOf("cd")); // 結果為2
Console.WriteLine("abcde abcde".IndexOf("CD", 6, StringComparison.CurrentCultureIgnoreCase)); // 結果為8

LastIndexOf,它和IndexOf類似,但是它是反向搜尋

IndexOfAny,它會返回一組字元裡任意一個元素的第一個匹配的位置。

Console.WriteLine("abc,de f".IndexOfAny(new char[] { ' ', ',' })); // 結果為3
Console.WriteLine("sdgp5jesu5fa9afe0".IndexOfAny("0123456789".ToCharArray())); // 結果為4

LastIndexOfAny,功能類似,方向相反

 

操縱/控制 string

因為string是不可變的,所以所有操縱string的方法返回的都是一個新的string,原來的string是原封不動的。

Substring,會抽取字串的一部分出來。

string left3 = "12345".Substring(0, 3); // 結果就是123
string mid3 = "12345".Substring(1, 3); // 結果為234
//如果忽略長度,那麼就從起始位置一直到字串的最後
string end3 = "12345".Substring(2); // 結果為345

Insert、Remove,在指定的位置插入、移除字串。

string s1 = "helloworld".Insert(5, ","); // 結果為hello,world
string s2 = s1.Remove(5, 1); // 結果為helloworld

PadLeft、PadRight,會使用指定的字元(沒有指定就是空格)填充string,以達到指定的長度(如果string原本長度就長於指定的長度,那麼它就不變)。

Console.WriteLine("12345".PadLeft(10, '*')); // 輸出結果就是*****12345
Console.WriteLine("12345".PadLeft(10)); // 輸出結果就是     12345

TrimStart,TrimEnd從開始或結尾移除指定的字元(預設是空白符:空格,tab,換行以及Unicode裡相應的變種)。

Trim,會把開始和結尾的空白字元都移除。

Console.WriteLine("   abc  \r\n  ".Trim().Length); // 結果為3

Replace,替換所有指定的字元/字串,(非重疊的)。

Console.WriteLine("hello world".Replace(" ", " | ")); // 結果為hello | world
Console.WriteLine("hello world".Replace(" ", "")); // 結果為helloworld

ToUpper,ToLower,返回string的大/小寫等等效形式。預設情況下也遵循使用者當前的語言設定,與上面的char的方法一樣,不再贅述。

 

拆分、合併字串

Split方法可以拆分字串。

  • 預設使用空格作為分隔符
  • 過載方法可以接收param字元陣列,或string作為分隔符
  • 可選接收StringSplitOptions列舉作為引數,有個選項可以移除空的字串
string[] words = "my name is bob".Split();
//列印結果依次輸出my name is bob四個單詞
foreach (var item in words)
{
    Console.WriteLine(item);
}
string[] split1 = "123-abc".Split('-');
//列印結果依次輸出123和abc兩個字串
foreach (var item in split1)
{
    Console.WriteLine(item);
}
string[] split2 = "123-abc-".Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
//列印結果依次輸出123和abc兩個字串,最後一個空項會被移除
foreach (var item in split2)
{
    Console.WriteLine(item);
}

Join(靜態)方法功能與Split相反,用於合併成一個字串,它需要一個分隔符和字串陣列。

string[] words = "my name is bob".Split();
Console.WriteLine(string.Join(",", words)); // 輸出結果為一個字串my,name,is,bob

Concat(靜態)方法,和Join類似,但是隻接收params string陣列作為引數,無需分隔符。和+的效果一樣,起始編譯器就是把它翻譯成+。

string str1 = string.Concat("hello", "world"); // 結果為helloworld
string str2 = "hello" + "world"; // 結果為helloworld

 

String.Format 和 複合格式的string

Format(靜態)方法,提供了一個方便的方式來構建嵌入變數的字串,嵌入的變數/值可以是任何型別,Format會呼叫它們的ToString方法。

含有嵌入變數的string就叫做複合格式string(composite format string)。

當你呼叫String.Format的時候,你就得傳入一個複合格式string,後邊跟著它裡面嵌入的這些變數。

string composite = "ab{0}cd{1}e";
Console.WriteLine(string.Format(composite, "123", 456)); // 結果為ab123cd456e

大括號裡的每個數字都叫做格式化項(format item),數值對應引數(argument)的位置,並且後邊可以跟著:

  • 一個逗號,和一個要應用的最小寬度(通常用來對齊列,負數表示左對齊,正數表示右對齊)
  • 一個冒號,和一個格式化字串(format string)
string composite = "Name={0, -20} Credit Limit={1,15:C}";
Console.WriteLine(string.Format(composite, "Bob", 500));
Console.WriteLine(string.Format(composite, "Elizatech", 20000));

結果如下:

 

 從C#6開始,你可以使用字串插值的方式(interpolated string literals)。

int value = 32;
Console.WriteLine($"abc{value}"); //結果為abc32

 

相關文章