第一次自己寫博客,就先記下自己遇到的以及常用的類型轉換的方式
第一、隱式轉換
byte, short, int, long, fload, double 等,根據這個排列順序,各種類型的值依次可以向后自動進行轉換
如果需要逆轉換,則需要進行強制轉化。同時考慮溢出的問題。
第二、數值型轉換成字符型
將數值轉換成字符串,因為每一個類都有一個 void ToString() 方法。所有數值型的 void ToString() 方法都能將數據轉換為數值字符串。如 123.ToSting() 就將得到字符串
"123"。
將數值型字符串轉換成數值, short, int, float 等數值類型均有一個 static Parse() 函數。這個函數就是用來將字符串轉換為相應數值的。以一個 float 類型的轉換為例: float f = float.Parse("543.21"); 其結果 f 的值為 543.21F。
第三、Convert類
System.Convert類可以實現各個基本數據類型之間的相互轉換。如:
int a=Convert.ToInt32("123");
string s=Convert.ToString(a);
int b=Convert.ChangeType("123",typeof(int));
但是Convert類只提供基本數據類型之間的轉換,沒有提供容器(如數組)類型以及自定義類型的相互轉換。如果要實現自定義類型的與基本數據類型之間相互轉換,應使自定義類型實現IConvertible接口。
第三、字符的 ASCII 碼和 Unicode 碼
這個還沒怎么用過。保留以后用的時候再整理
下面一部分是轉的
一:單個變量的類型轉換:
1 非強制類型轉換:
不任何說明,編譯器會自動完成的轉換,如 int a=0;float b=a;double c=b;
2 強制類型轉換:
需要加上強制類型說明符,否則編譯不通過,如double c=0.0;float b=(float)c;int a=(int)b;
3 Parse與ToString方法:
提供各種數據類型與字符串之間的相互轉換。大部分數據類型不能通過對字符串的強制類型轉換得到,如string s="123";int a=(int)s;這樣會引發編譯錯誤,因為string無法強制類型轉換為int。但是可以通過Parse方法來做這個事情,如int a=int.Parse(s);。大部分基本的值類型都有Parse方法,但引用類型基本上都沒有,不過,雖然不是所有的類型都能從字符串轉換得到,但是所有的類型都能轉換成字符串,因為所有的類型都有ToString方法。如int a=123;string s=a.ToString();
順便說一下,Parse是一個比較嚴格的方法,只要字符串的格式有一點點不對,它就會拋出異常,比如int.Parse("123.0"),或int.Parse("123,45")都會拋出異常。解決方法:如果是"123.0"之類,先Parse成浮點數,再強制類型轉換成整數,如果是"123,45",可以先用string的Spilt方法分割字符串,再對分割后的每個串分別Parse,這樣會得到一個int 數組{123,45}。
另外String.Format方法提供了更豐富的把數值轉化為字符串的格式。
4 Convert類
System.Convert類可以實現各個基本數據類型之間的相互轉換。如:
int a=Convert.ToInt32("123");
string s=Convert.ToString(a);
int b=Convert.ChangeType("123",typeof(int));
但是Convert類只提供基本數據類型之間的轉換,沒有提供容器(如數組)類型以及自定義類型的相互轉換。如果要實現自定義類型的與基本數據類型之間相互轉換,應使自定義類型實現IConvertible接口。
5 TypeConverter
System.ComponentModel.TypeConverter類提供了各種類型轉換器的基類,但是你不應該構造這個類或這個類的派生類的實例,而應該通過System.ComponentModel.TypeDescriptor的GetConverter方法來獲取這個轉換器,再利用這個轉換器進行轉換。如下面代碼把字符串"red"轉換成紅顏色:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
對於自定義的類型,你可以通過繼承TypeConverter類來實現轉換,這是最終極的方法,可以實現任意兩個類型之間的相互轉換,具體實現比較復雜,這里就不說了。具體可參閱MSDN的
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system/html/35bffd5f-b9aa-1ccd-99fe-b0833551e562.htm
6 XmlReader類
System.Xml.XmlReader類可以把文本轉換為各種基本數據類型,包括數組類型,但要先把文本做成xml格式,比較麻煩。如以下代碼可以把文本轉換成double數組:
XmlReader xr=XmlReader.Create("E://1.xml"); xr.MoveToContent();
double[] b=(double[])xr.ReadElementContentAs(typeof(double[]), null);
當然你要把在E盤做一個xml文件,可以這樣做: 123 1.2 4.2 5.6 57.5
也就是說,在數值前后加上和就行了,當然你可以把root換成任何其它的字符串都可以。用記事本另存為,文件名后綴為xml就行了。
二 容器與容器之間的相互轉換(不改變容器元素的類型)
1 構造函數
許多容器的構造函數可以傳入另一個容器的數值,如new List(new int[]{1,2})把一個int數組作為參數構造了一個新的List泛型類,事實上只要實現了IEnumerable接口的容器都可以這樣相互轉換。
2 CopyTo,ToArray,ToList函數
只要實現了ICollection接口的容器,都可以用CopyTo方法把數據復制到一個數組中。只要實現了IEnumerable接口,都可以用ToArray,ToList方法把容器中的數據復制到一個數組或List中,
3 二維數組(或多維數組)與其它容器的轉換
.Net Framework中的二維數組默認是無法與一維數組或其它容器相互轉換的,但可以間接的轉換,用OfType擴展方法可以把二維數組轉換成IEnumerable,然后由IEnumerable的ToArray,ToList就可以轉換成一維數組或List。如下面代碼就把二維數組轉換成一維數組:
int[,] array2= { { 1, 2 }, { 1, 2 } }; int[] array1=array2.OfType().ToArray();
其實OfType真正的用途是篩選出某些特定類型的元素,而在這里實際上選擇了所有的元素。
三 容器內元素的類型轉換
1 Cast
任何實現IEnumerable接口的容器都可以使用這種方法。如下面把整數數組轉換成字符串數組:
int[] array1={1,2,3};
IEnumerable array2 =array1.Cast()
或 string[] array2=array1.Cast().ToArray();
但是,Cast方法只限於強制類型轉換和非強制類型轉換,而前面所說的Parse,Convert,TypeConverter等方法都不能用,比如你不能用Cast把字符串數組轉換成整數數組。
2 Select
原則上這種方法可以完成任何轉換。比如把字符串數組轉換成整數數組:
string[] s= { "1", "2", "3" }; int[] i=(s.Select(x=>int.Parse(x)).ToArray()); 或 int[] i=(s.Select(x=>Convert.ToInt32(x)).ToArray());
或 int[] i=(s.Select(x=>(int)TypeDescriptor.GetConverter(typeof(int)).ConvertFrom(x))).ToArray();
在這里用到了Lambda表達式。
3 ArrayList
System.Collections.ArrayList是一個可以容納任何類型元素的類,所以要實現元素的轉換,可以先把容器的元素復制到ArrayList,再把ArrayList的元素復制到另一種類型的容器,它會自動完成類型轉換。如把整數數組轉換成字符串數組:
int[] array1={1,2,3};
ArrayList array2=new ArrayList(array1);
string[] array3=array2.ToArray(typeof(string));
這種方法的缺點跟Cast一樣,就是只限於強制類型轉換和非強制類型轉換。
