溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

[C#]系列文章——關(guān)于C#,你應(yīng)該知道的2000件事情(001)

發(fā)布時(shí)間:2020-07-28 01:32:11 來(lái)源:網(wǎng)絡(luò) 閱讀:380 作者:ghcomeon 欄目:編程語(yǔ)言

 該系列文章從關(guān)于C#,你應(yīng)該知道的2000件事情翻譯

1. 使用foreach語(yǔ)句遍歷字符串

可以使用foreach語(yǔ)句遍歷字符串中的每個(gè)字符,迭代變量是char類型。

string secret = "Kint is Keyser Soze";
StringBuilder sbObfuscate = new StringBuilder();
foreach (char c in secret)
    sbObfuscate.Append((char)(c + 3));
Console.WriteLine(sbObfuscate);


2. TryParse方法指示類型轉(zhuǎn)換操作是否成功

可以使用Parse方法將代表數(shù)字的字符串轉(zhuǎn)化為和它等效的數(shù)值類型。

string numberString = "108";
int number = int.Parse(numberString);

以上操作會(huì)實(shí)現(xiàn)轉(zhuǎn)換:"108" à 108。但是上述操作存在一個(gè)問(wèn)題:如果字符串代表的不是相關(guān)的數(shù)值類型,或是代表的數(shù)字超過(guò)了要轉(zhuǎn)換類型的范圍,會(huì)產(chǎn)生FormatException或 OverflowException異常。

int n1 = int.Parse("3.4");//FormatException

可以通過(guò)使用TryParse的方法避免異常。如果轉(zhuǎn)換操作成功,則轉(zhuǎn)換值存儲(chǔ)在輸出參數(shù)中,TryParse返回true。如果轉(zhuǎn)換操作不成功,輸出參數(shù)不會(huì)寫入,TryParse的返回false,不會(huì)拋出異常。

int n1;
if (int.TryParse("3.4", out n1))
    Console.WriteLine("Parse worked--n1 contains number");
else
    Console.WriteLine("Can't parse");

3.字符串是不可變的

C#中,字符串(System.String Type)是不可變的,操作字符串的函數(shù)(方法)不會(huì)改變字符串的實(shí)例,實(shí)際上返回字符串的一個(gè)新的實(shí)例。例如,可以使用Replace方法替換字符串的一部分,可以將結(jié)果賦值給原始的那個(gè)字符串或是一個(gè)新的字符串。

  如果忘記了字符串是不可變的,可能會(huì)將Replace方法執(zhí)行的結(jié)果賦值給其他的變量。而編譯器對(duì)此不會(huì)提醒或是警告。

string quote = "Go to Heaven for the climate, Hell for the company.";
Console.WriteLine(quote);
// Does NOT change quote.  Rather, it creates 
//a new string, which we don't store anywhere
quote.Replace("Hell", "Minnesota");
Console.WriteLine(quote);

在C#中,字符串創(chuàng)建以后就是不可變的,但是可以通過(guò)把對(duì)字符串的操作結(jié)果賦值給新的字符串變量來(lái)改變舊字符串的值。

string s1 = "AGORA";
s1 = s1.Replace('A', 'Z');   // Replace A's with Z's

在這種情況下,原來(lái)的字符串s1被銷毀,包含操作結(jié)果的字符串賦值給s1。在大部分的場(chǎng)合,字符串是不可變的并不影響什么,因?yàn)槿匀豢梢酝ㄟ^(guò)將操作結(jié)果賦值給原來(lái)的字符串變量來(lái)改變字符串的值。

但是,在考慮對(duì)同一字符串重復(fù)相同的字符串的操作時(shí)的效率時(shí),字符串是不可變的是非常關(guān)鍵的。使用字符串連接操作符(+)是非常方便的,但是效率不高,因?yàn)槊看芜B接操作都會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象。

string s1 = "";
for (int i = 0; i < 50000; i++)
    s1 = s1 + i.ToString();//+對(duì)象操作每次都會(huì)創(chuàng)建一個(gè)新的string
可以通過(guò)StringBuilder類的Append方法提高以上代碼的效率,Append方法避免在每次迭代中創(chuàng)建新的string對(duì)象。
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 50000; i++)
    sb.Append(i.ToString());
后者的效率至少是前者的30倍。

4.獲取包含代理編碼對(duì)(Surrogate Pairs)的字符串的長(zhǎng)度

可以使用string.Length屬性來(lái)獲取字符串的長(zhǎng)度(字符的個(gè)數(shù)),但是,注意,這只有在字符串的Unicode代碼點(diǎn)不大于U+FFFF時(shí)可以正常獲取,Unicode代碼點(diǎn)集合也稱為BMP(BasicMultilingual Plane)—基本多語(yǔ)言平面.

  而BMP之外的Unicode代碼點(diǎn)的代表是使用4字節(jié)代理編碼對(duì)的 UTF-16 ,而BMP的Unicode代碼點(diǎn)使用的是2字節(jié).

  為了正確統(tǒng)計(jì)代碼點(diǎn)可能包含高于U+FFFF字符串的字符個(gè)數(shù),可以使用StringInfo類(System.Globalization)

string simple = "abc";// 3 Latin (ASCII) characters
// 3 character string where one character is a surrogate pair
string containsSurrogatePair = "AC";
// Length=3 (correct)
Console.WriteLine(string.Format("Length 1 = {0}", simple.Length)); 
// Length=4 (not quite correct)
Console.WriteLine(string.Format("Length 2 = {0}", containsSurrogatePair.Length));
 
// Better, reports Length=3
StringInfo si = new StringInfo(containsSurrogatePair);
Console.WriteLine(string.Format("Length 3 = {0}", si.LengthInTextElements));

盡管如此,在大部分的時(shí)候,仍然可以使用string.Length獲取字符串的長(zhǎng)度(字符個(gè)數(shù)),但是應(yīng)該注意Length屬性返回組成字符串的char對(duì)象的個(gè)數(shù),而這和實(shí)際上的Unicode字符個(gè)數(shù)不一樣的.

string simple = "abc";// 3 Latin (ASCII) characters
string other = "ā丁";// 2 other characters: U+0100, E+4E01
 
Console.WriteLine(string.Format("Length 1 = {0}", simple.Length));//3
Console.WriteLine(string.Format("Length 2 = {0}", other.Length));//2

5. 通過(guò)正則表達(dá)式在字符串中檢查有效字符

using System.Text.RegularExpressions;
public bool IsAlphabetic(string s)
{
    Regex r = new Regex(@"^[a-zA-Z]+$");//判斷字符串是否由字母組成
    //Regex r = new Regex(@"^[0-9]+$"");//判斷字符串是否由數(shù)組組成
    return r.IsMatch(s);
}

以上方法判斷字符串 s 是否由字母組成,注意一下幾點(diǎn):

^  代表字符串的開始

[a..zA..Z] 小寫或大寫字母

+ 字符串的字符可以重復(fù)

$ 字符串的結(jié)束


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI