該系列文章從關于C#,你應該知道的2000件事情翻譯
可以使用foreach語句遍歷字符串中的每個字符,迭代變量是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方法將代表數字的字符串轉化為和它等效的數值類型。
string numberString = "108"; int number = int.Parse(numberString);
以上操作會實現轉換:"108" à 108。但是上述操作存在一個問題:如果字符串代表的不是相關的數值類型,或是代表的數字超過了要轉換類型的范圍,會產生FormatException或 OverflowException異常。
int n1 = int.Parse("3.4");//FormatException
可以通過使用TryParse的方法避免異常。如果轉換操作成功,則轉換值存儲在輸出參數中,TryParse返回true。如果轉換操作不成功,輸出參數不會寫入,TryParse的返回false,不會拋出異常。
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)是不可變的,操作字符串的函數(方法)不會改變字符串的實例,實際上返回字符串的一個新的實例。例如,可以使用Replace方法替換字符串的一部分,可以將結果賦值給原始的那個字符串或是一個新的字符串。
如果忘記了字符串是不可變的,可能會將Replace方法執行的結果賦值給其他的變量。而編譯器對此不會提醒或是警告。
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#中,字符串創建以后就是不可變的,但是可以通過把對字符串的操作結果賦值給新的字符串變量來改變舊字符串的值。
string s1 = "AGORA"; s1 = s1.Replace('A', 'Z'); // Replace A's with Z's
在這種情況下,原來的字符串s1被銷毀,包含操作結果的字符串賦值給s1。在大部分的場合,字符串是不可變的并不影響什么,因為仍然可以通過將操作結果賦值給原來的字符串變量來改變字符串的值。
但是,在考慮對同一字符串重復相同的字符串的操作時的效率時,字符串是不可變的是非常關鍵的。使用字符串連接操作符(+)是非常方便的,但是效率不高,因為每次連接操作都會創建一個新的字符串對象。
string s1 = ""; for (int i = 0; i < 50000; i++) s1 = s1 + i.ToString();//+對象操作每次都會創建一個新的string
可以通過StringBuilder類的Append方法提高以上代碼的效率,Append方法避免在每次迭代中創建新的string對象。
StringBuilder sb = new StringBuilder(""); for (int i = 0; i < 50000; i++) sb.Append(i.ToString());
后者的效率至少是前者的30倍。
可以使用string.Length屬性來獲取字符串的長度(字符的個數),但是,注意,這只有在字符串的Unicode代碼點不大于U+FFFF時可以正常獲取,Unicode代碼點集合也稱為BMP(BasicMultilingual Plane)—基本多語言平面.
而BMP之外的Unicode代碼點的代表是使用4字節代理編碼對的 UTF-16 ,而BMP的Unicode代碼點使用的是2字節.
為了正確統計代碼點可能包含高于U+FFFF字符串的字符個數,可以使用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));
盡管如此,在大部分的時候,仍然可以使用string.Length獲取字符串的長度(字符個數),但是應該注意Length屬性返回組成字符串的char對象的個數,而這和實際上的Unicode字符個數不一樣的.
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]+$"");//判斷字符串是否由數組組成 return r.IsMatch(s); }
以上方法判斷字符串 s 是否由字母組成,注意一下幾點:
^ 代表字符串的開始
[a..zA..Z] 小寫或大寫字母
+ 字符串的字符可以重復
$ 字符串的結束
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。