字串的處理
•C#中單個字元用單引號包含就是char類型,(‘a’),單引號中放且只能放一個字元。ASCII碼
•單個字元也可以表示為字串,還可以有長度為0的字串。null和""的區別,String.IsNullOrEmpty•使用s.Length屬性來獲得字串中的字元個數•string可以看做是char的唯讀數組。char c = s[1];。例子:遍曆輸出string中的每個元素。•C#中字串有一個重要的特性:不可變性,字串一旦聲明就不再可以改變。所以只能通過索引來讀取指定位置的char,不能對指定位置的char進行修改。
如果要對char進行修改,那麼就必須建立一個新的字串,用s.
ToCharArray()方法得到字串的char數組,對數組進行修改後,調用new string(char[])這個建構函式(暫時不用細研究)來建立char數組的字串。一旦字串被建立,那麼char數組的修改也不會造成字串的變化。例子:將字串中的A替換為a
//字串是不可變的,所以要先產生一個char[],再對char[]進行修改
//再根據char[]產生新的字串,但是原先的字串沒有改變(他就在那裡)
//可以根據人產生模型,也可以根據模型產生人,但是人不能修改。
//這樣根據李詠產生模型,然後把臉搞短,再產生李詠2,李詠2和李詠是兩個對象
//s=new string(s);相當於李詠2把李詠殺死替換了李詠,好像李詠臉變短了,但是是兩個執行個體
//string s="abc";是聲明一個變數s,把s指向"abc"這個字串。
//strings1 = "123456";
//char[] chars1 =s1.ToCharArray();//是根據s1複製一份char[]
//chars1[0] = 'w';//不會影響s1
//string s2 = new string(chars1);//根據chars1產生一份新的string
//Console.WriteLine(s2);
//Console.WriteLine(s1);
//chars1[0] = 'c';//並不會影響s2
//Console.WriteLine(s2);
//面試練習題:字串轉換為大寫、小寫、翻轉,inttostring
是一個拷貝的過程:
//strings1 = "123456";
//char[] chars1 =s1.ToCharArray();//是根據s1複製一份char[]
//chars1[0] = 'w';//不會影響s1
//string s2 = new string(chars1);//根據chars1產生一份新的string
//Console.WriteLine(s2);
//Console.WriteLine(s1);
//chars1[0] = 'c';//並不會影響s2
//Console.WriteLine(s2);
string[]c = new string[]{ "零","壹","貳","三","肆","伍","陸","柒","捌","玖","年","月","日"
};
try
{
string input = "2009年9月5日";
StringBuilderstr =new
StringBuilder();
for (intcount = 0; count <
input.Length;count++)
{
string temp =
input.Substring(count,1);
switch (temp)
{
case "1":
str.Append(c[1]);break;
case "2":
str.Append(c[2]);break;
case "3":
str.Append(c[3]);break;
case "4":
str.Append(c[4]);break;
case "5":
str.Append(c[5]);break;
case "6":
str.Append(c[6]);break;
case "7":
str.Append(c[7]);break;
case "8":
str.Append(c[8]);break;
case "9":
str.Append(c[9]);break;
case "0":
str.Append(c[0]);break;
case "年":
str.Append(c[10]);break;
case "月":
str.Append(c[11]);break;
case "日":
str.Append(c[12]);break;
default: break;
}
}
this.button1.Text =
str.ToString();
}
catch (Exception ex)
{
throw new Exception("已經過測試");
}
還可以進一步最佳化,全部用查表法
常見疑問
•誰說字串不可變?strings = "abc";s="123",s這不是變了嗎•要區分變數名和變數指向的值的區別。程式中可以有很多字串,然後由字串變數指向他們,變數可以指向其他的字串,但是字串本身沒有變化。字串不可變性指的是記憶體中的字串不可變,而不是變數不變。•strings10 = s1;//s10指向s1指向的字串,而不是s10指向s1,哪怕s1以後指向了其他記憶體,那麼s10還是指向"hello"•ToLower():得到字串的小寫形式。•注意字串是不可變的,所以這些函數都不會直接改變字串的內容,而是把修改後的字串的值通過函數傳回值的形式返回。s.ToLower()與s=s.ToLower()•ToUpper():得到字串的大寫形式;Trim()去掉字串兩端的空白(不會去掉中間的)。•s1.Equals(s2,StringComparison.OrdinalIgnoreCase),兩個字串進行比區分大小寫比較。推薦這種用法。•strings2 = string.Format("{0}年{1}月{2}日",
year, month, day);•用Reflector看WriteLine和string.Format的關係。看別人程式的實現、看微軟的實現,偷窺的快感!•strings1 = string.Join("|", values);//第一個參數是string類型分隔字元
字串分割
•string[]Split(params char[] separator):將字串按照指定的分割符分割為字串數組;•string[]Split(char[] separator, StringSplitOptions options)將字串按照指定的char分割符分割為字串數組(options取RemoveEmptyEntries的時候移除結果中的空白字串);•string[]Split(string[] separator, StringSplitOptions options)將字串按照指定的string分割符分割為字串數組。•例子1:從日期文字("2008-08-08")中分析出年、月、日;2008年08月08日。•例子2:從一個記錄了學產生績的文字文件,每個學產生績是一行,每行是用|分割的資料,用|分割的域分別是姓名、年齡、成績,寫程式取出成績最高學生的姓名和成績。參考:使用string[]
lines =System.IO.File.ReadAllLines(@"c:\root.ini",
Encoding.Default);從文字檔讀取資料,傳回值為string數組,每個元素是一行。(5 min)