您好,登錄后才能下訂單哦!
該系列文章從關(guān)于C#,你應(yīng)該知道的2000件事情翻譯
可以使用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);
可以使用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");
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倍。
可以使用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
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é)束
免責(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)容。