[转载] 黑马程序员_学习笔记8_C#基础归纳之数组
參考鏈接: Java中的鋸齒數(shù)組Jagged array
---------------------- Windows Phone 7手機開發(fā)、.Net培訓、期待與您交流! ----------------------?
什么是數(shù)組??
? ?數(shù)組是一組數(shù)據(jù)結構,它可以包含同一類型的多個元素。C#用特殊記號還申明和初始化數(shù)組。這其實是在后臺把當前數(shù)組和Array聯(lián)系起來,?
以便數(shù)組可以使用Array提供的某些功能。?
??
數(shù)組分簡單數(shù)組和多維數(shù)組。?
? ?
簡單數(shù)組:?
數(shù)組的申明 int[] intarr;?
數(shù)組的初始化有四種形式:?
1: int[] intarr = new int[4];//給定數(shù)組階數(shù)?
2: int[] intarr = new int[4]{1,2,3,4};//給定階數(shù),并給定每個元素的具體數(shù)值?
3: int[] intarr = new int[]{1,2,3,4};//不給定階數(shù),就必須每個元素的具體值(和1對應)?
4:? int[] intarr = {1,2,3,4};//最簡形式(類比第三種)?
??
訪問數(shù)組元素:?
? 數(shù)組只有再申明和初始化之后才能訪問到數(shù)組元素。數(shù)組元素只支持整數(shù)索引。?
? ?int[] intarr ={1,2,3,4};?
? ?int v1 = intarr[0];//訪問?
? ?intarr[1] =5;//賦值?
使用數(shù)組也特別注意一點 不要超過當前數(shù)組的索引長度。?
比如:intArr[100]=6;//此時編譯器就會跑出一個IndexOutOfRangeException的異常。?
??
數(shù)組元素的迭代訪問可以有兩種方式。?
通過數(shù)組元素的Length屬性 進數(shù)組進行循環(huán)迭代。?
for(int i=0;i<intarr.Length;i++)?
{?
? ? ? ? ? Console.WriteLine(intarr[i]Tostring()?
}?
該可以使用foreach對數(shù)組進行迭代?
foreach(int i in intarr)?
{?
? ? Console.WriteLine(i.ToString());?
}?
不是所有的數(shù)據(jù)對象都能使用foreach進行迭代,只有實現(xiàn)了IEnumeraable接口的對象 才能使用foreach對其進行迭代。?
前面也已經(jīng)說過了,在C#中使用【】申明數(shù)組 其實也是使用Array類的標記,Array是實現(xiàn)了該接口的,所以你可以使用foreach對?
數(shù)組對象進行迭代。?
??
數(shù)組除了上面 .NET預定義的數(shù)據(jù)值類型之外,還可以是我們自己定義的應用類型。?
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);?
??
特別注意,對于引用類型數(shù)組,必須為每一個數(shù)組元素指定引用(分配內(nèi)存)。否則 就會跑出NullReferenceExpection異常.?
??
??
多維數(shù)組:?
二位數(shù)組?
?int[,] twodim = new int[1,1];?
? twodim[0,0]=1;?
? twodim[0,1]=2;?
? twodim[1,0]=3;?
? twodim[1,1]=4;?
? 二維數(shù)組可以看做是一個普通的表結構。?
?二維數(shù)組的遍歷?
?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]);?
? ?}?
}?
??
鋸齒數(shù)組:?
?二維數(shù)組可以看錯是一個標準的表結構,鋸齒數(shù)組就可以看錯是一個不標準的表結構了 它的列不定必須相同。?
鋸齒數(shù)組的申明:?
int[][] jagged = new int[3][];//前面一個中括號中3表示該鋸齒數(shù)組有三行,后面[]什么也不寫,表明列不確定,這也符合鋸齒數(shù)組的定義。?
鋸齒數(shù)組的每一行其實都是一個單獨的數(shù)組對象。?
jagged[0] = new int[2]{1,2,3};//?
jagged[1] = new int{4,5,6,7};?
jagged[2] ={7,8,9,10,11};?
??
鋸齒數(shù)組的遍歷:?
for(int row =0;row<jagged.Length;row++)//遍歷行,也就是遍歷有多少個數(shù)組?
{?
? ? ? for(int element=0;element<jagged[row].Length;element++)//jagged[row]..當前行的那個數(shù)組的長度?
? ? {?
? ? ? ? ? ? ? ? Console.WriteLine("第{0}個數(shù)組 該數(shù)組的當前索引為{1}? ? 值為{2}",row,element,jagged[row][element]);?
? ?
? ?}?
}?
??
??
Array類;在C#中使用[ ] 申明數(shù)組其實就是使用Array的標記。?
Array是一個抽象類,抽象類不能實例化,所以不能使用Array[ ]等形式創(chuàng)建數(shù)組。?
但Array類提供了一個靜態(tài)的方法用于創(chuàng)建各種數(shù)據(jù)類型的數(shù)組?
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;?
??
復制數(shù)組:?
因為數(shù)組是引用類型,所以講一個數(shù)組的變量賦于另外一個數(shù)組的變量時,就會得到兩個引用相同的一組變量。?
而賦值數(shù)組,會使數(shù)組實現(xiàn)ICloneable接口。這個接口的方法會定義的Clone()方法將創(chuàng)建數(shù)組的淺表復制。?
? ?淺表復制的意思是:?
如果數(shù)組元素是值類型,數(shù)組間的復制只是復制當前數(shù)組的值,而非引用?
int[ ] intArr ={1,1,2,3};?
int [] cloneArr = (int[ ])intArr.Clone();?
如果數(shù)組包含的不是值,而是引用,則直接賦值引用?
Person[ ]? Persons ={new Person("jack",25),new Person("Tom",21)};?
Person[ ] ClonePersons = (Person[ ])Persons.Clone();?
??
?數(shù)組的排序:?
數(shù)組的排序 可以調(diào)用Array的Sort方法,此方法通過QuickSort的算法對數(shù)組中的元素進行排序。?
Sort方法中 進行排序的元素 必須要實現(xiàn)IComparable接口。.NET內(nèi)置的string和int等數(shù)據(jù)類型默認已經(jīng)實現(xiàn)了該接口,?
所以 你的數(shù)組只要是這兩種形式的都可以直接使用Array.Sort()方法進行排序。?
現(xiàn)在我們來敲一個例子,能讓我們自定義的數(shù)據(jù)類型能夠使用Array.Sort方法進行排序。?
//先定義一個數(shù)據(jù)類型
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>
{
? ? ? //實現(xiàn)接口中的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);?
??
數(shù)組做作為參數(shù) 和返回值:?
int[ ]? DoSomeWithArr(int[ ])?
{?
? ?//...............?
}??
??
數(shù)組協(xié)變:?
數(shù)組支持協(xié)變。這表示數(shù)組可以申明為基類,其他的派生類都可以作為當前數(shù)組的參數(shù)?
static void DisplayArrayObject(Object[] obj)?
{?
? ? ?//........?
}?
??
數(shù)組片段?
ArraySegment<T>?
它有一個構造函數(shù)的重載?
new ArraySegment<int>(param1,param2,param3);?
param1表示為你需要截取的數(shù)組對象?
Param2 表示開始索引?
param3 表示長度?
?---------------------- Windows Phone 7手機開發(fā)、.Net培訓、期待與您交流! ---------------------- 詳細請查看:http://net.itheima.com/
總結
以上是生活随笔為你收集整理的[转载] 黑马程序员_学习笔记8_C#基础归纳之数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载] Java中的命名参数
- 下一篇: c#中索引器是什么_C#中的索引器