參考鏈接: Java中的鋸齒數組Jagged array
---------------------- Windows Phone 7手機開發、.Net培訓、期待與您交流! ----------------------?
什么是數組??
? ?數組是一組數據結構,它可以包含同一類型的多個元素。C#用特殊記號還申明和初始化數組。這其實是在后臺把當前數組和Array聯系起來,?
以便數組可以使用Array提供的某些功能。?
??
數組分簡單數組和多維數組。?
? ?
簡單數組:?
數組的申明 int[] intarr;?
數組的初始化有四種形式:?
1: int[] intarr = new int[4];//給定數組階數?
2: int[] intarr = new int[4]{1,2,3,4};//給定階數,并給定每個元素的具體數值?
3: int[] intarr = new int[]{1,2,3,4};//不給定階數,就必須每個元素的具體值(和1對應)?
4:? int[] intarr = {1,2,3,4};//最簡形式(類比第三種)?
??
訪問數組元素:?
? 數組只有再申明和初始化之后才能訪問到數組元素。數組元素只支持整數索引。?
? ?int[] intarr ={1,2,3,4};?
? ?int v1 = intarr[0];//訪問?
? ?intarr[1] =5;//賦值?
使用數組也特別注意一點 不要超過當前數組的索引長度。?
比如:intArr[100]=6;//此時編譯器就會跑出一個IndexOutOfRangeException的異常。?
??
數組元素的迭代訪問可以有兩種方式。?
通過數組元素的Length屬性 進數組進行循環迭代。?
for(int i=0;i<intarr.Length;i++)?
{?
? ? ? ? ? Console.WriteLine(intarr[i]Tostring()?
}?
該可以使用foreach對數組進行迭代?
foreach(int i in intarr)?
{?
? ? Console.WriteLine(i.ToString());?
}?
不是所有的數據對象都能使用foreach進行迭代,只有實現了IEnumeraable接口的對象 才能使用foreach對其進行迭代。?
前面也已經說過了,在C#中使用【】申明數組 其實也是使用Array類的標記,Array是實現了該接口的,所以你可以使用foreach對?
數組對象進行迭代。?
??
數組除了上面 .NET預定義的數據值類型之外,還可以是我們自己定義的應用類型。?
class? Person?
{?
? ? ?public Person(string name,string age)?
? ? ?{?
? ? ? ? ? ? this.Name = name;?
? ? ? ? ? ? this.Age =age;?
? ? ?}?
? ? ? public string Name{get;set;}?
? ? ?public int Age{get;set;}?
}?
??
Person[] MyPersons = new Person[2];?
MyPerson[0]=new Person("jack",25);?
MyPerson[1] = new Person("Tom",21);?
??
特別注意,對于引用類型數組,必須為每一個數組元素指定引用(分配內存)。否則 就會跑出NullReferenceExpection異常.?
??
??
多維數組:?
二位數組?
?int[,] twodim = new int[1,1];?
? twodim[0,0]=1;?
? twodim[0,1]=2;?
? twodim[1,0]=3;?
? twodim[1,1]=4;?
? 二維數組可以看做是一個普通的表結構。?
?二維數組的遍歷?
?for(int row =0;row<twodim.Length(0);row++)//先遍歷行?
{?
? ? ?for(int col=0;col<twodim.Length(1);col++)//在遍歷列?
? ? {?
? ? ? ? ? ? ?Console.WriteLine("Row? {0}? ?Col{1}? ? ? ?Value{2}",row,col,twodim[row,col]);?
? ?}?
}?
??
鋸齒數組:?
?二維數組可以看錯是一個標準的表結構,鋸齒數組就可以看錯是一個不標準的表結構了 它的列不定必須相同。?
鋸齒數組的申明:?
int[][] jagged = new int[3][];//前面一個中括號中3表示該鋸齒數組有三行,后面[]什么也不寫,表明列不確定,這也符合鋸齒數組的定義。?
鋸齒數組的每一行其實都是一個單獨的數組對象。?
jagged[0] = new int[2]{1,2,3};//?
jagged[1] = new int{4,5,6,7};?
jagged[2] ={7,8,9,10,11};?
??
鋸齒數組的遍歷:?
for(int row =0;row<jagged.Length;row++)//遍歷行,也就是遍歷有多少個數組?
{?
? ? ? for(int element=0;element<jagged[row].Length;element++)//jagged[row]..當前行的那個數組的長度?
? ? {?
? ? ? ? ? ? ? ? Console.WriteLine("第{0}個數組 該數組的當前索引為{1}? ? 值為{2}",row,element,jagged[row][element]);?
? ?
? ?}?
}?
??
??
Array類;在C#中使用[ ] 申明數組其實就是使用Array的標記。?
Array是一個抽象類,抽象類不能實例化,所以不能使用Array[ ]等形式創建數組。?
但Array類提供了一個靜態的方法用于創建各種數據類型的數組?
Array? intarray1 = Array.CreateInstance(typeof(int),5);//此方法的返回類型仍然為Array?
for(int i=0;i<5;i++)?
{?
? ? ?intarray1.SetValue(i,i);?
}?
可以通過強制轉化將intarray1轉化為int[ ]類型?
int[] MyIntArr = (int[])intarray1;?
??
復制數組:?
因為數組是引用類型,所以講一個數組的變量賦于另外一個數組的變量時,就會得到兩個引用相同的一組變量。?
而賦值數組,會使數組實現ICloneable接口。這個接口的方法會定義的Clone()方法將創建數組的淺表復制。?
? ?淺表復制的意思是:?
如果數組元素是值類型,數組間的復制只是復制當前數組的值,而非引用?
int[ ] intArr ={1,1,2,3};?
int [] cloneArr = (int[ ])intArr.Clone();?
如果數組包含的不是值,而是引用,則直接賦值引用?
Person[ ]? Persons ={new Person("jack",25),new Person("Tom",21)};?
Person[ ] ClonePersons = (Person[ ])Persons.Clone();?
??
?數組的排序:?
數組的排序 可以調用Array的Sort方法,此方法通過QuickSort的算法對數組中的元素進行排序。?
Sort方法中 進行排序的元素 必須要實現IComparable接口。.NET內置的string和int等數據類型默認已經實現了該接口,?
所以 你的數組只要是這兩種形式的都可以直接使用Array.Sort()方法進行排序。?
現在我們來敲一個例子,能讓我們自定義的數據類型能夠使用Array.Sort方法進行排序。?
//先定義一個數據類型
public class Person
{
? ? ? public Person(string FirstName,string LastName)
? ? ?{
? ? ? ? ?this.FirstName = FirstName;
? ? ? ? ?this.LastName = LastName;
? ? ?}
?
? ? ?public string FirstName;
? ? ?public string LastName;
}?
我們使Person類繼承IComparable<T>接口(不知道什么是T的 學習日記7泛型)?
public class Person:IComparable<Person>
{
? ? ? //實現接口中的CompareTo方法
? ? public CompareTo(Person other)
? ? ?{
? ? ? ? ? ?if(other==null)
? ? ? ? ? ? ? ? ? throw new ArgsNullExecption("Null");
? ? ? ? ? ?int result = this.LastName.CompareTo(other.LastName);
? ? ? ? ? ? if(result==0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?this.FirstName.CompareTo(other.FirstName);
?
? ? ? ? ? ? }
? ? ? ? ? ? ?return result;
? ? ?}
}?
?這個方法首先是比較 Person的LastName 如果相同? 就比較 LastName;?
然后我們就可以使用Array.Sort方法對Person類的對象進行排序了。?
Person[] Persons = {new Person("jack",25),new Person("Tom",21)};
?
Array.Sort(Persons);?
??
數組做作為參數 和返回值:?
int[ ]? DoSomeWithArr(int[ ])?
{?
? ?//...............?
}??
??
數組協變:?
數組支持協變。這表示數組可以申明為基類,其他的派生類都可以作為當前數組的參數?
static void DisplayArrayObject(Object[] obj)?
{?
? ? ?//........?
}?
??
數組片段?
ArraySegment<T>?
它有一個構造函數的重載?
new ArraySegment<int>(param1,param2,param3);?
param1表示為你需要截取的數組對象?
Param2 表示開始索引?
param3 表示長度?
?---------------------- Windows Phone 7手機開發、.Net培訓、期待與您交流! ---------------------- 詳細請查看:http://net.itheima.com/