第3章 常用數(shù)據(jù)類型用法new_第1頁
第3章 常用數(shù)據(jù)類型用法new_第2頁
第3章 常用數(shù)據(jù)類型用法new_第3頁
第3章 常用數(shù)據(jù)類型用法new_第4頁
第3章 常用數(shù)據(jù)類型用法new_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1 1第第3 3章章 常用數(shù)據(jù)類型的用法常用數(shù)據(jù)類型的用法3.1 字符串字符串3.2 數(shù)組數(shù)組3.3 枚舉枚舉3.4 泛型泛型3.5 泛型集合泛型集合3.6 日期與時間處理日期與時間處理3.7 數(shù)學(xué)運(yùn)算數(shù)學(xué)運(yùn)算3.8 隨機(jī)數(shù)隨機(jī)數(shù)2 23.1 3.1 字符串字符串 StringString類(類(string)string) string類型是一個密封類型(不能被繼承),其實例表示類型是一個密封類型(不能被繼承),其實例表示Unicode字符串字符串,每個英文字母、漢字都占兩個字節(jié)。每個英文字母、漢字都占兩個字節(jié)。創(chuàng)建字符串創(chuàng)建字符串ustring myString = “some text”

2、; /直接賦字符串常量值直接賦字符串常量值ustring s2 = new string(a,2); /調(diào)用構(gòu)造函數(shù),結(jié)果為調(diào)用構(gòu)造函數(shù),結(jié)果為aaustring str = “C:testfirst.cs” /含轉(zhuǎn)義字符,用雙含轉(zhuǎn)義字符,用雙 ustring str = “C:testfirst.cs” /含轉(zhuǎn)義字符,含轉(zhuǎn)義字符,加加后表示字符串內(nèi)后表示字符串內(nèi)的的不是轉(zhuǎn)義字符不是轉(zhuǎn)義字符獲取字符串的某個字符獲取字符串的某個字符string myString = “some text”;char ch = myString 2; /結(jié)果為結(jié)果為m,string下標(biāo)是下標(biāo)是0-based 3

3、3String類的成員類的成員uToString()方法方法u返回表示當(dāng)前對象的字符串。返回表示當(dāng)前對象的字符串。uToString()參數(shù)可空,也可以加一個格式化參數(shù)參數(shù)可空,也可以加一個格式化參數(shù)uObject o = new Object();u Console.WriteLine (o.ToString(); / Prints out: System.ObjectuString.Empty 表示空字符串表示空字符串u string s = ; u string s2 = string.Empty; u if (s = string.Empty) u / u 4 43.1 3.1 字符串

4、字符串字符串比較方法字符串比較方法u string.Compare(string s1,string s2) 如果如果s1大于大于s2,結(jié)果為,結(jié)果為1;如果如果s1等于等于s2,結(jié)果為,結(jié)果為0;如果如果s1小于小于s2,結(jié)果為,結(jié)果為-1。u string.Compare(string s1,string s2,bool ignoreCase) ignoreCase確定是否區(qū)分大小寫確定是否區(qū)分大小寫比較兩個字符串是否相等,還可使用:比較兩個字符串是否相等,還可使用:uEquals方法方法 和和 =u equals():比較的是兩個對象的內(nèi)容是否一致():比較的是兩個對象的內(nèi)容是否一致u

5、=:比較字符串的值比較字符串的值 附:附:=運(yùn)算符規(guī)則運(yùn)算符規(guī)則u對于值類型,如果對象的值相等,則對于值類型,如果對象的值相等,則=返回返回 true,否則返回,否則返回 false。u對于引用類型:對于引用類型:u對于對于 string 類型,類型,= 比較字符串的值。比較字符串的值。ustring 以外的引用類型,如果兩個對象引用同一個對象,則以外的引用類型,如果兩個對象引用同一個對象,則 = 返回返回 true。5 53.1 3.1 字符串字符串 字符串查找字符串查找uContains方法:方法:用于查找一個字符串中是否包含指定的子字用于查找一個字符串中是否包含指定的子字符串。語法為:符

6、串。語法為: public bool Contains( string value ) 例如:例如:string str1 = this is a string.; bool b=str1.Contains(is ) ;uIndexOf方法:方法:求某個字符求某個字符s或者子串或者子串s在字符串中出現(xiàn)的位置。在字符串中出現(xiàn)的位置。兩種最常用的重載形式:兩種最常用的重載形式: public int IndexOf(string s ) public int IndexOf(string s, int startIndex )uLastIndexOf方法:方法:LastIndexOf方法的用法與方

7、法的用法與IndexOf方法方法相同,查找最后一次出現(xiàn)的位置。相同,查找最后一次出現(xiàn)的位置。 6 63.1 3.1 字符串字符串例如例如:string str1 = this is a string.; Console.WriteLine(str1.IndexOf(is); /結(jié)果為結(jié)果為2(注意序號從注意序號從0開始開始)Console.WriteLine(str1.LastIndexOf(is); /結(jié)果為結(jié)果為5uIndexOfAny方法:方法:查找某個字符串中是否包含某些字符查找某個字符串中是否包含某些字符(多個不同的字符):(多個不同的字符):只要發(fā)現(xiàn)包含這些字符中的任何一個字符即只

8、要發(fā)現(xiàn)包含這些字符中的任何一個字符即可???。 常用語法:常用語法:public int IndexOfAny(char anyOf ) 例如:例如: string s1 = 123abc123abc123; char c = a, b, 5, 8 ; int x = s1.IndexOfAny(c); /x結(jié)果為結(jié)果為37 73.1 3.1 字符串字符串u截取字符串截取字符串Substring(int startIndex,int count) 截取字符串從截取字符串從startIndex位開始,截取長度為位開始,截取長度為count的字的字符串符串 例如:例如: string str=“ab

9、c123”; string ss = str.Substring(1,4); /(0-based) Console.WriteLine(ss); / bc128 83.1 3.1 字符串字符串u刪除指定數(shù)量的字符刪除指定數(shù)量的字符Remove(int startIndex,int count) 例如例如:string str1 = this is a string.“ Console.WriteLine(str1.Remove(1,2); /結(jié)果為結(jié)果為ts is a string u字符串替換字符串替換 Replace (string oldStr,string newStr) 例如例如:s

10、tring str1 = this is a string.“ Console.WriteLine(str1.Replace(is,xy); /結(jié)果為結(jié)果為thxy xy a string9 93.1 3.1 字符串字符串u插入字符串插入字符串 例如:例如:string s1 = abcdabcd; string s2 = s1.Insert(2, 12);/結(jié)果為結(jié)果為ab12cdabcd“u從字符串開頭或結(jié)尾刪除指定的字符從字符串開頭或結(jié)尾刪除指定的字符 :利用利用TrimStart刪除字刪除字符串首部空格,利用符串首部空格,利用TrimEnd刪除字符串尾部空格,利用刪除字符串尾部空格,利

11、用Trim刪除字符串首部和尾部空格。刪除字符串首部和尾部空格。例如:例如: string s1 = this is a book;string s2 = that is a pen;string s3 = is a pen ;Console.WriteLine(s1.TrimStart(); /刪除首部空格刪除首部空格Console.WriteLine(s2.TrimEnd(); /刪除尾部空格刪除尾部空格Console.WriteLine(s3.Trim(); /刪除首部和尾部空格刪除首部和尾部空格10103.1 3.1 字符串字符串u字符串的合并與拆分字符串的合并與拆分 Join方法方法:

12、字符串?dāng)?shù)組字符串?dāng)?shù)組-字符串字符串 在數(shù)組的每個元素之間串聯(lián)在數(shù)組的每個元素之間串聯(lián)指定的分隔符,從而產(chǎn)生單個串聯(lián)的字符串。指定的分隔符,從而產(chǎn)生單個串聯(lián)的字符串。 語法為:語法為: public static string Join( string separator, string value ) Split方法方法:字符串字符串-字符串?dāng)?shù)組字符串?dāng)?shù)組 將字符串按照指定的一個或?qū)⒆址凑罩付ǖ囊粋€或多個字符進(jìn)行分離,從而得到一個字符串?dāng)?shù)組。多個字符進(jìn)行分離,從而得到一個字符串?dāng)?shù)組。 常用語法為:常用語法為: public string Split( params char separat

13、or )1111字符串的合并和拆分舉例字符串的合并和拆分舉例例如:例如:string sArray1 = 123, 456, abc ;string s1 = string.Join(, sArray1); /結(jié)果為結(jié)果為123,456,abcstring sArray2 = s1.Split(,); /sArray2得到的結(jié)果與得到的結(jié)果與sArray1相同相同string s2 = abc 12;34,56;string sArray3 = s2.Split(, ;, ); /分隔符為分隔符為逗號、分號、空格逗號、分號、空格Console.WriteLine(string.Join(Env

14、ironment.NewLine,sArray3);輸出結(jié)果:輸出結(jié)果:abc12345612123.1 3.1 字符串字符串 ToUpper大寫大寫 ToLower小寫小寫例如:例如:string s1 = This is a string;string s2 = s1.ToUpper( ); /s2結(jié)果為結(jié)果為THIS IS A STRINGstring s3 = Console.ReadLine( );if (s3.ToLower( ) = yes) Console.WriteLine(OK);13133.2 String3.2 String和和StringBuilderStringBu

15、ilder String類實際上表示的是一系列不可變的字符。說其實例是類實際上表示的是一系列不可變的字符。說其實例是“不可變的不可變的”,是因為無法直接修改給該字符串分配的堆中,是因為無法直接修改給該字符串分配的堆中的字符串。的字符串。 例如,在例如,在myString的后面接上另一個字符串:的后面接上另一個字符串: myString += and a bit more; 其實際操作并不是在原來其實際操作并不是在原來myString所占內(nèi)存空間的后面直接附加上第二所占內(nèi)存空間的后面直接附加上第二個字符串,而是返回一個新個字符串,而是返回一個新String實例,即重新為新字符串分配內(nèi)存空間。實例

16、,即重新為新字符串分配內(nèi)存空間。 StringBuilder類位于類位于System.Text名稱空間下,使用名稱空間下,使用StringBuilder類每次重新生成新字符串時不是再生成一個新類每次重新生成新字符串時不是再生成一個新實例,而是直接在原來字符串占用的內(nèi)存空間上進(jìn)行處理,實例,而是直接在原來字符串占用的內(nèi)存空間上進(jìn)行處理,而且它可以動態(tài)的分配占用的內(nèi)存空間大小。而且它可以動態(tài)的分配占用的內(nèi)存空間大小。1414StringBuilderStringBuilder類用法舉例類用法舉例【例例3-1】StringBuilder類的基本用法。類的基本用法。using System;using

17、 System.Text;namespace StringBuilderExample class Program public static void Main( ) StringBuilder s1 = new StringBuilder( ); s1.Append(string1); s1.AppendLine(string2); s1.Append(string3); string s2 = s1.ToString( ); Console.WriteLine(s2); Console.ReadLine( ); 15153.3 3.3 數(shù)組數(shù)組 u 數(shù)組用于存儲同一種類型的數(shù)據(jù)。數(shù)組用于

18、存儲同一種類型的數(shù)據(jù)。u 數(shù)組是一種引用類型,而不是值類型。數(shù)組是一種引用類型,而不是值類型。u 數(shù)組是按照數(shù)組名、數(shù)據(jù)元素的類型和維數(shù)來描述的。數(shù)組是按照數(shù)組名、數(shù)據(jù)元素的類型和維數(shù)來描述的。u C#中可以有一維數(shù)組、多維數(shù)組、交錯數(shù)組。中可以有一維數(shù)組、多維數(shù)組、交錯數(shù)組。1.數(shù)組的聲明與初始化數(shù)組的聲明與初始化 聲明數(shù)組時,既可以一開始就指定數(shù)組元素的個數(shù),也可以一開始不聲明數(shù)組時,既可以一開始就指定數(shù)組元素的個數(shù),也可以一開始不指定元素個數(shù),而是在使用數(shù)組元素前動態(tài)地指定元素個數(shù)。指定元素個數(shù),而是在使用數(shù)組元素前動態(tài)地指定元素個數(shù)。例如:例如:int a = new int30; /

19、0-basedstring mystring = “first”,“second”,“third”; /簡化形式,不帶簡化形式,不帶new的只能的只能用在聲明語句中用在聲明語句中. 例如:例如:string mystring;mystring = “first”,“second”,“third”; /errormystring= new string“first”,“second”,“third”; /right1616數(shù)組的聲明語法舉例數(shù)組的聲明語法舉例 數(shù)組類型數(shù)組類型語法語法例子例子一維數(shù)組一維數(shù)組數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組變量;數(shù)組變量;int myArray;二維數(shù)組二維數(shù)組數(shù)據(jù)類型數(shù)據(jù)

20、類型, 數(shù)組變量;數(shù)組變量;int, myArray;三維數(shù)組三維數(shù)組數(shù)據(jù)類型數(shù)據(jù)類型, 數(shù)組變量;數(shù)組變量;int, myArray;交錯數(shù)組交錯數(shù)組每一個元素又是一個數(shù)組數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組變量;數(shù)組變量;int myArray;1717數(shù)組的秩與數(shù)組長度數(shù)組的秩與數(shù)組長度2.2.數(shù)組的秩與數(shù)組長度數(shù)組的秩與數(shù)組長度數(shù)組的秩(數(shù)組的秩(rankrank)是指數(shù)組的維數(shù),例如一維數(shù)組秩為)是指數(shù)組的維數(shù),例如一維數(shù)組秩為1 1,二維,二維數(shù)組秩為數(shù)組秩為2 2。數(shù)組長度是指數(shù)組中所有元素的個數(shù)。例如:數(shù)組長度是指數(shù)組中所有元素的個數(shù)。例如:int a = new int10; /int a

21、 = new int10; /數(shù)組長度為數(shù)組長度為1010int, b = new int3, 5; /int, b = new int3, 5; /數(shù)組長度為數(shù)組長度為3 3* *5=155=15,其中第,其中第0 0維維長度為長度為3 3,第,第1 1維長度為維長度為5 51818數(shù)組數(shù)組3.一維數(shù)組一維數(shù)組在在C#中,數(shù)組的下標(biāo)默認(rèn)是中,數(shù)組的下標(biāo)默認(rèn)是從從0開始索引開始索引的。的。Length屬性表示數(shù)組的長度。屬性表示數(shù)組的長度。4.多維數(shù)組多維數(shù)組多維數(shù)組指維數(shù)大于多維數(shù)組指維數(shù)大于1的數(shù)組,常用的是二維數(shù)組和三維數(shù)組。的數(shù)組,常用的是二維數(shù)組和三維數(shù)組。C#語言支持兩種類型的二維

22、數(shù)組,一種是二維矩形數(shù)組,另一語言支持兩種類型的二維數(shù)組,一種是二維矩形數(shù)組,另一種是二維交錯數(shù)組。種是二維交錯數(shù)組。對于二維矩形數(shù)組,數(shù)組中的每一行都有相同的列數(shù)。對于二維矩形數(shù)組,數(shù)組中的每一行都有相同的列數(shù)。例如:例如:int, n2 = new int, 1, 2, 3, 4, 5, 6 ;1919數(shù)組用法舉例數(shù)組用法舉例【例例3-2】編寫一個控制臺應(yīng)用程序,定義一個二維數(shù)組,分別輸出數(shù)組的秩、數(shù)組長編寫一個控制臺應(yīng)用程序,定義一個二維數(shù)組,分別輸出數(shù)組的秩、數(shù)組長度以及數(shù)組中的每個元素值。度以及數(shù)組中的每個元素值。 static void Main(string args) int,

23、 b = new int3, 5; Console.WriteLine(b的秩為:的秩為:0, b.Rank); /結(jié)果為結(jié)果為2 Console.WriteLine(b的長度為:的長度為:0, b.Length); /結(jié)果為結(jié)果為15 for (int i = 0; i b.GetLength(0); i+) / b.GetLength(0)指獲取第指獲取第0維的長度維的長度 for (int j = 0; j b.GetLength(1); j+) / b.GetLength(1)指獲取第指獲取第1維的長度維的長度 Console.Write(b0,1=2t, i, j, bi, j);

24、Console.WriteLine(); Console.ReadLine(); 2020數(shù)組數(shù)組5.交錯數(shù)組交錯數(shù)組交錯數(shù)組相當(dāng)于一維數(shù)組的每一個元素又是一個數(shù)組,也可以把交錯數(shù)組相當(dāng)于一維數(shù)組的每一個元素又是一個數(shù)組,也可以把交錯數(shù)組稱為交錯數(shù)組稱為“數(shù)組的數(shù)組數(shù)組的數(shù)組”。例如:例如:int n1 = new int2 new int 2,4,6, new int 1,3,5,7,9;交錯數(shù)組的每一個元素既可以是一維數(shù)組,也可以是多維數(shù)組。交錯數(shù)組的每一個元素既可以是一維數(shù)組,也可以是多維數(shù)組。2121交錯數(shù)組用法舉例交錯數(shù)組用法舉例【例例3-3】交錯數(shù)組的用法。交錯數(shù)組的用法。publ

25、ic static void Main() string b = new string3; b0 = new string2 b11, b12 ; b1 = new string3 b21, b22, b23 ; b2 = new string5 a, e, i, o, u ; for (int i = 0; i b.Length; i+) for (int j = 0; j bi.Length; j+) Console.Write(b01=2 , i, j, bij); Console.WriteLine(); Console.ReadLine(); 2222數(shù)組數(shù)組6.動態(tài)改變數(shù)組的大小動

26、態(tài)改變數(shù)組的大小 Resize方法方法 public static void Resize( ref T array, int newSize ) 這是一種這是一種泛型泛型表示形式。其中表示形式。其中T表示數(shù)組類型,表示數(shù)組類型,array為要調(diào)整大為要調(diào)整大小的一維數(shù)組,該數(shù)組從零開始;如果為小的一維數(shù)組,該數(shù)組從零開始;如果為null則新建具有指定則新建具有指定大小的數(shù)組。大小的數(shù)組。如果如果newSize大于舊數(shù)組的大于舊數(shù)組的Length,則分配一個新數(shù)組,并將所有元素從,則分配一個新數(shù)組,并將所有元素從舊數(shù)組復(fù)制到新數(shù)組。舊數(shù)組復(fù)制到新數(shù)組。如果如果newSize小于舊數(shù)組的小于舊數(shù)

27、組的Length,則分配一個新數(shù)組,并將元素從舊數(shù),則分配一個新數(shù)組,并將元素從舊數(shù)組復(fù)制到新數(shù)組直到新數(shù)組被填滿為止;舊數(shù)組中的剩余元素將被忽組復(fù)制到新數(shù)組直到新數(shù)組被填滿為止;舊數(shù)組中的剩余元素將被忽略。略。如果如果 newSize與舊數(shù)組的與舊數(shù)組的 Length相等,則此方法不執(zhí)行任何操作。相等,則此方法不執(zhí)行任何操作。2323動態(tài)改變數(shù)組的大小舉例動態(tài)改變數(shù)組的大小舉例【例例3-4】演示如何動態(tài)改變一維數(shù)組的大小。演示如何動態(tài)改變一維數(shù)組的大小。 static void Main(string args) String myArr = fox, lazy, dog ; Console

28、.WriteLine(初始值初始值:); PrintArrayValues(myArr); Array.Resize(ref myArr, myArr.Length + 2); Console.WriteLine(調(diào)整為較大的長度后的值:調(diào)整為較大的長度后的值:); PrintArrayValues(myArr); Array.Resize(ref myArr, 4); Console.WriteLine(調(diào)整為較小的長度后的值:調(diào)整為較小的長度后的值:); PrintArrayValues(myArr); Console.ReadLine(); public static void Prin

29、tArrayValues(String myArr) for (int i = 0; i myArr.Length; i+) Console.WriteLine(0:1, i, myArri); 2424數(shù)組數(shù)組7.數(shù)組元素的排序與查找數(shù)組元素的排序與查找C#語言中還提供了語言中還提供了Sort和和Reverse這樣的靜態(tài)方法,這些方法這樣的靜態(tài)方法,這些方法用快速排序算法將一維數(shù)組中的元素按照升序或降序排列。用快速排序算法將一維數(shù)組中的元素按照升序或降序排列。還可以方便地查找指定的元素。例如還可以方便地查找指定的元素。例如Contains方法和方法和IndexOf方法等。方法等。2525數(shù)組

30、排序數(shù)組排序和查找舉例和查找舉例【例例3-5】一維數(shù)組的排序和查找。一維數(shù)組的排序和查找。2626數(shù)組的統(tǒng)計以及數(shù)組和字符串間的轉(zhuǎn)數(shù)組的統(tǒng)計以及數(shù)組和字符串間的轉(zhuǎn)換換 利用數(shù)組的利用數(shù)組的Average方法、方法、Sum方法、方法、Max方法和方法和Min方法方法可以求數(shù)組中所有元素的平均值、求所有元素的和、最大可以求數(shù)組中所有元素的平均值、求所有元素的和、最大值和最小值。值和最小值。 對于對于字符串?dāng)?shù)組字符串?dāng)?shù)組,可以直接利用字符串的,可以直接利用字符串的Join方法和方法和Split方方法實現(xiàn)字符串和字符串?dāng)?shù)組之間的轉(zhuǎn)換。法實現(xiàn)字符串和字符串?dāng)?shù)組之間的轉(zhuǎn)換。2727數(shù)組元素統(tǒng)計和字符串轉(zhuǎn)換

31、舉例數(shù)組元素統(tǒng)計和字符串轉(zhuǎn)換舉例【例例3-6】演示如何統(tǒng)計數(shù)組中的元素以及如何實現(xiàn)演示如何統(tǒng)計數(shù)組中的元素以及如何實現(xiàn)int數(shù)組和數(shù)組和字符串字符串之間的轉(zhuǎn)換。之間的轉(zhuǎn)換。2828補(bǔ)充:字節(jié)數(shù)組補(bǔ)充:字節(jié)數(shù)組bytebyte 和和stringstring的轉(zhuǎn)換的轉(zhuǎn)換 string類型轉(zhuǎn)成類型轉(zhuǎn)成byte: byte byteArray = System.Text.Encoding.Default.GetBytes ( str ); 反過來,反過來,byte轉(zhuǎn)成轉(zhuǎn)成string: string str = System.Text.Encoding.Default.GetString ( byte

32、Array ); Encoding.Default:獲取操作系統(tǒng)的當(dāng)前獲取操作系統(tǒng)的當(dāng)前 ANSI 代碼頁的編碼。代碼頁的編碼。由由 Default 定義的系統(tǒng)定義的系統(tǒng) ANSI 代碼頁包含代碼頁包含 ASCII 字符集,但是其編碼不同于字符集,但是其編碼不同于 ASCII 的的編碼。編碼。 由于所有的由于所有的 Default 編碼會丟失數(shù)據(jù),因此編碼會丟失數(shù)據(jù),因此應(yīng)用程序可以改用應(yīng)用程序可以改用 UTF8 代替代替 。 在在 U+00 到到 U+7F 的范圍內(nèi),的范圍內(nèi),UTF-8與與ASCII通常是相同的,但是通常是相同的,但是可以在不丟失數(shù)據(jù)可以在不丟失數(shù)據(jù)的情況下對其他字符進(jìn)行編

33、碼的情況下對其他字符進(jìn)行編碼。在處理文本時,經(jīng)常需要處理在處理文本時,經(jīng)常需要處理Encoding的概念。存在這個問題的原因在于,的概念。存在這個問題的原因在于,在在.NET程序內(nèi)文本只是程序內(nèi)文本只是string和和char對象,而保存到硬盤時,或者準(zhǔn)備用對象,而保存到硬盤時,或者準(zhǔn)備用socket把它發(fā)送把它發(fā)送出去時,都得先轉(zhuǎn)換成出去時,都得先轉(zhuǎn)換成byte或者字節(jié)流?;蛘咦止?jié)流。而轉(zhuǎn)換的算法,就是而轉(zhuǎn)換的算法,就是Encoding。一臺機(jī)。一臺機(jī)器用器用socket發(fā)送一段文本到另一臺機(jī)器,兩邊都設(shè)定編碼方式為發(fā)送一段文本到另一臺機(jī)器,兩邊都設(shè)定編碼方式為Encoding.Defaul

34、t,如果發(fā)送的是非,如果發(fā)送的是非western字符,則接受方必然會得到亂碼。字符,則接受方必然會得到亂碼。所以在面對中文且為所以在面對中文且為ANSI編碼的情況下,最好不要用編碼的情況下,最好不要用Encoding.Default,而用,而用 Encoding.GetEncoding(gb2312),或者更直接的,或者更直接的Encoding.GetEncoding(936);而如果有可能的話,最好全部使用而如果有可能的話,最好全部使用unicode,比如,比如utf-8,也就是,也就是Encoding.UTF8。有了有了unicode之后,其實我們不需要代碼頁的概念。之后,其實我們不需要代

35、碼頁的概念。2929 其它編碼方式的,如其它編碼方式的,如:System.Text.UTF8,System.Text.Unicode等;等;例如:例如: string類型轉(zhuǎn)成類型轉(zhuǎn)成ASCII byte: 01 轉(zhuǎn)成轉(zhuǎn)成 byte = new byte 0 x30, 0 x31 byte byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); ASCII byte 轉(zhuǎn)成轉(zhuǎn)成string: byte = new byte 0 x30, 0 x31 轉(zhuǎn)成轉(zhuǎn)成 01 string str = System.Text.Encoding.ASCI

36、I.GetString ( byteArray );3030 示例:數(shù)據(jù)庫中圖片的處理:示例:數(shù)據(jù)庫中圖片的處理:1) 從數(shù)據(jù)庫中讀出圖片(以從數(shù)據(jù)庫中讀出圖片(以image類型存儲的類型存儲的), 并且寫入并且寫入txt文件中:文件中:byte image = (byte)myTable.Rows0ImageFile;string FS= Encoding. ASCII.GetString(image); WriteStr(F:test.txt,FS);2) 把圖片從把圖片從txt文件中讀出然后存入數(shù)據(jù)庫中。文件中讀出然后存入數(shù)據(jù)庫中。 string ss = ReadStr(F:test.

37、txt); byte b = Encoding.ASCII.GetBytes(ss); string sql = update Persons set ImageFile=img where PersonID = 1; SqlParameter sp = new SqlParameter(img,SqlDbType.Image); sp.Value = b; myCommand.Parameters.Add(sp); myCommand.ExecuteNonQuery();31313.3 3.3 枚舉枚舉u 枚舉(枚舉(enum)是)是一組命名常量的集合一組命名常量的集合,稱為枚舉成員列表。它

38、,稱為枚舉成員列表。它可以為一組在邏輯上密不可分的整數(shù)值提供便于記憶的符號,從可以為一組在邏輯上密不可分的整數(shù)值提供便于記憶的符號,從而使代碼更清晰,也易于維護(hù)。而使代碼更清晰,也易于維護(hù)。u 聲明聲明enum類型變量的語法為:類型變量的語法為: 附加聲明附加聲明 訪問修飾符訪問修飾符 enum 名稱名稱:數(shù)據(jù)類型數(shù)據(jù)類型 枚舉列表枚舉列表 例如:例如:enum Number1:bytex1=3,x2=5 /x1常量為常量為3,x2常量為常量為5enum Number2:bytex1=3,x2 /x1常量為常量為3,x2常量在前一個常量自動常量在前一個常量自動+1為為4enum daysMon

39、, Tue,Wed,Thu,F(xiàn)ri,Sat/默認(rèn):默認(rèn):常量為常量為int,Mon:0Sat:6 注意注意:enum days:byteX1=255,X2 /錯誤錯誤, X2越越byte界界32323.4 3.4 泛型泛型 泛型泛型是是C# 2.0中的新增元素中的新增元素(C+中稱為中稱為模板模板),主要用于解,主要用于解決一系列類似的問題。決一系列類似的問題。 這種機(jī)制允許將這種機(jī)制允許將類名作為參數(shù)類名作為參數(shù)傳遞給泛型類型,并生成相傳遞給泛型類型,并生成相應(yīng)的對象。應(yīng)的對象。 將泛型將泛型(包括類、接口、方法、委托等包括類、接口、方法、委托等)看作模板可能更好理看作模板可能更好理解,類名

40、稱傳遞給模板中的變體部分,從而得到一個新的解,類名稱傳遞給模板中的變體部分,從而得到一個新的類型定義。類型定義。33333.4 3.4 泛型泛型泛型(泛型(Generic)是具有占位符(類型參數(shù))的類、結(jié)構(gòu)、接口)是具有占位符(類型參數(shù))的類、結(jié)構(gòu)、接口和方法和方法與普通類的區(qū)別:泛型多了一個或多個表示類型的類型參數(shù),與普通類的區(qū)別:泛型多了一個或多個表示類型的類型參數(shù),這些類型參數(shù)用尖括號括起來。這些類型參數(shù)用尖括號括起來。例如:例如:public class MyClass public T MyProp get; set; /定義屬性定義屬性MyProp public void Prin

41、t( ) Console.WriteLine(MyProp); 3434泛型泛型【例例3-8】演示泛型的定義與用法。演示泛型的定義與用法。 class Program public static void Swap(ref T item1, ref T item2) T temp = item1; item1 = item2; item2 = temp; static void Main( ) Double d1 = 0, d2 = 2; Console.WriteLine(交換前:交換前:0,1, d1, d2); Swap(ref d1, ref d2); Console.WriteLin

42、e(交換后:交換后:0,1, d1, d2); Console.ReadLine( ); 3535可空泛型可空泛型 假如您有一個數(shù)字類型的變量,用于控制從數(shù)據(jù)庫中獲取假如您有一個數(shù)字類型的變量,用于控制從數(shù)據(jù)庫中獲取的數(shù)值。數(shù)據(jù)庫可能為這個變量返回一個的數(shù)值。數(shù)據(jù)庫可能為這個變量返回一個null值。您需要一值。您需要一個簡潔的方法來存儲這個數(shù)值,即使返回數(shù)值為個簡潔的方法來存儲這個數(shù)值,即使返回數(shù)值為null。 解決方案:解決方案:l使用使用可空類型可空類型。 有兩個創(chuàng)建可空類型的方法。有兩個創(chuàng)建可空類型的方法。System.Nullable variable - 或或 -T? variabl

43、e T 是可空類型的基礎(chǔ)類型。是可空類型的基礎(chǔ)類型。T 可以是包括可以是包括 struct 在內(nèi)的在內(nèi)的任何任何值類型值類型;但不能是引用類型。;但不能是引用類型。3636 本質(zhì)上,下面兩個聲明是等價的:本質(zhì)上,下面兩個聲明是等價的:int? myDBInt = null;Nullable myDBInt = new Nullable(); 兩個聲明中,兩個聲明中,myDBInt都被認(rèn)為是可空類型并初始化為都被認(rèn)為是可空類型并初始化為null。 一個可空類型實現(xiàn)了一個可空類型實現(xiàn)了InullableValue接口,它只有兩個屬性成接口,它只有兩個屬性成員:員:HasValue和和Value。如

44、果把可空類型設(shè)置為。如果把可空類型設(shè)置為null,HasValue屬性將返回屬性將返回false,否則將返回,否則將返回true。3737測試可空類型方法測試可空類型方法 第一,使用第一,使用HasValue屬性如下:屬性如下: if (myDBInt.HasValue) /HasValue 成員用于在嘗試顯示變量之前測試成員用于在嘗試顯示變量之前測試它是否包含值它是否包含值 Console.WriteLine(Has a value: + myDBInt.Value); else Console.WriteLine(Does not have a value (NULL); 第二種方法是跟第

45、二種方法是跟null對比:對比: if (myDBInt != null) Console.WriteLine(Has a value: + myDBInt.Value); else Console.WriteLine(Does not have a value (NULL);3838集合類型集合類型集合是集合是OOP中的一個重要概念,中的一個重要概念,C#中對集合的全面支持更是該語言的精華之一。中對集合的全面支持更是該語言的精華之一。集合類型是數(shù)據(jù)集合的常見變體,例如哈希表、隊列、堆棧、字典和列表。集合類型是數(shù)據(jù)集合的常見變體,例如哈希表、隊列、堆棧、字典和列表。根據(jù)存儲元素的方式、對元素進(jìn)

46、行排序的方式、執(zhí)行搜索的方式以及進(jìn)行比較的方式的不根據(jù)存儲元素的方式、對元素進(jìn)行排序的方式、執(zhí)行搜索的方式以及進(jìn)行比較的方式的不同,集合可能也有所不同。同,集合可能也有所不同。 Queue 類和類和 Queue(Of ) 泛型類提供先進(jìn)先出列表,而泛型類提供先進(jìn)先出列表,而 Stack 類和類和 Stack(Of ) 泛型類提供后進(jìn)先出列表。泛型類提供后進(jìn)先出列表。 Hashtable 類和類和 Dictionary(Of ) 泛型類提供非排序的集合類型。泛型類提供非排序的集合類型。 SortedList 類和類和 SortedList(Of ) 泛型類提供泛型類提供 Hashtable 類和

47、類和 Dictionary(Of ) 泛型類的排序的版本。泛型類的排序的版本。 Hashtable 或或 Dictionary(Of ) 中的元素只能通過元素的鍵訪問;中的元素只能通過元素的鍵訪問;而而 SortedList 或或 KeyedCollection(Of ) 中的元素既可以通過元素的鍵訪中的元素既可以通過元素的鍵訪問,也可以通過元素的索引訪問。問,也可以通過元素的索引訪問。所有集合中的索引都從零開始。不過所有集合中的索引都從零開始。不過 Array 除外,它允許使用索引不從零開始的數(shù)組。除外,它允許使用索引不從零開始的數(shù)組。39393.5 3.5 泛型集合泛型集合 在在Syste

48、m.Collections.Generic命名空間下,提供了常用的泛型集合類。命名空間下,提供了常用的泛型集合類。泛型集合類非泛型集合類泛型集合用法舉例ListArrayListList dinosaurs = new List( );DictionaryHashtableDictionary d = new Dictionary( );d.Add (txt, notepad.exe);QueueQueueQueue q = new Queue( );q.Enqueue(one);StackStackStack s = new Stack( );s.Push(one);s.Pop( );Sor

49、tedListSortedListSortedList list = new SortedList( );list.Add (txt, notepad.exe); list.TryGetValue(tif, out value)40401-1-哈希集合哈希集合 HashSet是在是在System.Collections.Generic命名空間中包含一個集合類。命名空間中包含一個集合類。 HashSet用于數(shù)學(xué)集合運(yùn)算用于數(shù)學(xué)集合運(yùn)算.常用方法:常用方法:Add():如果某元素不在集合中,如果某元素不在集合中,Add()方法就把該元素添加到集合中。在其返回值方法就把該元素添加到集合中。在其返回值

50、Boolean中,中,返回元素是否添加的信息返回元素是否添加的信息Clear():刪除集合中的所有元素刪除集合中的所有元素Remove():刪除指定的元素刪除指定的元素RemoveWhere():刪除滿足謂詞條件的所有元素刪除滿足謂詞條件的所有元素CopyTo():把集合中的元素復(fù)制到一個數(shù)組中把集合中的元素復(fù)制到一個數(shù)組中 ExceptWith():把一個集合作為參數(shù),從集中刪除該集合中的所有元素把一個集合作為參數(shù),從集中刪除該集合中的所有元素 IntersectWith():修改當(dāng)前的修改當(dāng)前的 HashSet(Of T) 對象,以僅包含該對象和指定集合中存在的元對象,以僅包含該對象和指定

51、集合中存在的元素。素。 UnionWith():把傳送為參數(shù)的集合中的所有元素添加到集中把傳送為參數(shù)的集合中的所有元素添加到集中 詳見表詳見表3-341412-2-字典和排序字典字典和排序字典uDictionary泛型類泛型類提供了從一組鍵提供了從一組鍵key到一到一組值組值value的映射(的映射(key-value)。)。u字典中的每個添加項都由一個值及其相關(guān)聯(lián)的鍵組成,通字典中的每個添加項都由一個值及其相關(guān)聯(lián)的鍵組成,通過鍵來檢索值。過鍵來檢索值。該泛型類提供的常用方法如下。該泛型類提供的常用方法如下。Add方法:將帶有指定鍵和值的元素添加到字典中。方法:將帶有指定鍵和值的元素添加到字典

52、中。TryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)的值。方法:獲取與指定的鍵相關(guān)聯(lián)的值。ContainsKey方法:確定字典中是否包含指定的鍵。方法:確定字典中是否包含指定的鍵。Remove方法:從字典中移除帶有指定鍵的元素。方法:從字典中移除帶有指定鍵的元素。4242 Dictionary 類與類與 Hashtable 類的功能相同。類的功能相同。 對于值類型,對于值類型,Dictionary的性能優(yōu)于的性能優(yōu)于 Hashtable,這是因為,這是因為 Hashtable 的元素屬于的元素屬于 Object 類型,類型,所以在存儲或檢索值類型時通常發(fā)生裝箱和取消裝箱操作。所以在存儲或檢索值

53、類型時通常發(fā)生裝箱和取消裝箱操作。4343HashtableHashtable Hashtable集合中的每個元素都是一個鍵集合中的每個元素都是一個鍵/值對值對。在。在Hashtable中用作元素的每一對象使用中用作元素的每一對象使用 GetHashCode 方法方法為其自身生成哈希代碼,該哈希代碼是基于該元素的鍵。為其自身生成哈希代碼,該哈希代碼是基于該元素的鍵。 Hashtable集合基于散列值,集合基于散列值,插入元素的操作非???,不需插入元素的操作非??欤恍枰褚馤ist類那樣重排集合類那樣重排集合。44443-3-列表和排序列表列表和排序列表uC#為動態(tài)列表提供了類為動態(tài)列表提供

54、了類List和和ArrayList。System.Collections.Generic命名空間中的類命名空間中的類List的用法的用法非常類似于非常類似于System.Collections命名空間中的命名空間中的ArrayList類。類。uList泛型類泛型類表示可通過索引訪問的強(qiáng)類型對象列表,該表示可通過索引訪問的強(qiáng)類型對象列表,該類提供了對列表進(jìn)行搜索、排序和操作的方法。類提供了對列表進(jìn)行搜索、排序和操作的方法。 強(qiáng)類型:為所有變量指定數(shù)據(jù)類型稱為強(qiáng)類型:為所有變量指定數(shù)據(jù)類型稱為“強(qiáng)類型強(qiáng)類型”,強(qiáng)類型嚴(yán)格的在編強(qiáng)類型嚴(yán)格的在編譯期進(jìn)行檢查譯期進(jìn)行檢查u創(chuàng)建列表創(chuàng)建列表List in

55、tList = new List();List racers = new List();45453-3-列表和排序列表列表和排序列表u常用方法如下:常用方法如下:Add方法:將指定值的元素添加到列表中。方法:將指定值的元素添加到列表中。Insert方法:在列表的中間插入一個新元素。方法:在列表的中間插入一個新元素。Contains方法:測試該列表中是否存在某個元素。方法:測試該列表中是否存在某個元素。Remove方法:從列表中移除帶有指定鍵的元素。方法:從列表中移除帶有指定鍵的元素。Clear方法:移除列表中的所有元素。方法:移除列表中的所有元素。uSortedList排序列表,用法與排序列表

56、,用法與List類似。類似。uSortedList表示鍵表示鍵/值對的集合,這些鍵值對值對的集合,這些鍵值對按鍵排序按鍵排序并可并可按照鍵和索引訪問。按照鍵和索引訪問。4646列表和排序列表舉例列表和排序列表舉例【例例3-9】演示泛型列表的定義與用法。演示泛型列表的定義與用法。47474-4-鏈表鏈表 LinkedList為雙向鏈表。為雙向鏈表。LinkedList對象中的每個節(jié)對象中的每個節(jié)點(diǎn)都屬于點(diǎn)都屬于LinkedListNode類型。每個節(jié)點(diǎn)又指向其類型。每個節(jié)點(diǎn)又指向其Next節(jié)點(diǎn)和節(jié)點(diǎn)和Previous節(jié)點(diǎn)。節(jié)點(diǎn)。 LinkedList可以保存可以保存null值并且允許有重復(fù)的元素

57、。值并且允許有重復(fù)的元素。 如果如果LinkedList為空,則為空,則First和和Last屬性為屬性為null。4848string words = the, fox, jumped, over, the, dog ;LinkedList sentence = new LinkedList(words);/ Add the word today to the beginning of the linked list.sentence.AddFirst(today);/ Move the first node to be the last node.LinkedListNode mark1

58、= sentence.First;sentence.RemoveFirst();sentence.AddLast(mark1);/ Change the last node be yesterday. sentence.RemoveLast(); sentence.AddLast(yesterday);/ Indicate fox node. current = sentence.Find(fox);49495-5-隊列隊列uQueue泛型類泛型類表示對象的先進(jìn)先出(表示對象的先進(jìn)先出(LILO)集合。隊列)集合。隊列在按接收順序存儲消息方面非常有用,存儲在隊列中的對在按接收順序存儲消息方面非

59、常有用,存儲在隊列中的對象在一端插入,從另一端移除。象在一端插入,從另一端移除。u隊列隊列可以保存可以保存null值并且允許有重復(fù)的元素。值并且允許有重復(fù)的元素。常用方法如下:常用方法如下: Enqueue方法:將指定元素插入列尾。方法:將指定元素插入列尾。 Dequeue方法:隊列首元素出列。方法:隊列首元素出列。5050 Queue numbers = new Queue(); /字符串隊列字符串隊列 numbers.Enqueue(“one”); /入列入列 numbers.Enqueue(two); numbers.Enqueue(three); numbers.Enqueue(fou

60、r); numbers.Enqueue(five); / A queue can be enumerated without disturbing its contents. foreach( string number in numbers ) Console.WriteLine(number); Console.WriteLine(nDequeuing 0, numbers.Dequeue(); /出列出列 Console.WriteLine(Peek at next item to dequeue: 0, numbers.Peek(); /Peek 返回位于返回位于 Queue(Of T) 開始

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論