【回顧】C#從入門到精通第七章筆記
C#從入門到精通(第五版)第七章筆記

數(shù)組和集合
1.什么是數(shù)組
數(shù)組是具有相同數(shù)據(jù)類型的一組數(shù)據(jù)的集合。
數(shù)組中的每一個(gè)變量稱為數(shù)組的元素,數(shù)組能夠容納元素的數(shù)量稱為數(shù)組的長(zhǎng)度。
2.一維數(shù)組
2.1.一維數(shù)組的創(chuàng)建
數(shù)組作為對(duì)象允許使用new關(guān)鍵字進(jìn)行內(nèi)存分配。
一維數(shù)組的創(chuàng)建有以下兩種形式:
語法1:數(shù)據(jù)類型 []? 數(shù)組名;? ??
比如:
代碼如下:
int []arr;
但是聲明數(shù)組后,還不能訪問它的任何元素,因?yàn)槁暶鲾?shù)組只是給出了數(shù)組名字和元素?cái)?shù)據(jù)類型。
要想真正使用數(shù)組,還要為它分配內(nèi)存空間。在為數(shù)組分配內(nèi)存空間時(shí)必須指明數(shù)組的長(zhǎng)度。為數(shù)組分配內(nèi)存空間的語法格式如下:
數(shù)組名字=new 數(shù)組元素類型[數(shù)組元素個(gè)數(shù)]
比如:
代碼如下:
arr=new int[50];
語法2:數(shù)據(jù)類型 []? 數(shù)組名=new 數(shù)據(jù)類型 [數(shù)組元素個(gè)數(shù)];
這種創(chuàng)建數(shù)組的方法就是將數(shù)組的聲明和內(nèi)存的分配配合在一起進(jìn)行。
比如:
代碼如下:
int[] arr=new int[50];
2.2.一維數(shù)組的初始化
數(shù)組的初始化有兩種形式:
int[] arr1=new int[5]{1,2,3,4,5};
或
int[] arr2={1,2,3,4,5};
2.3.一維數(shù)組的使用
需要存儲(chǔ)多個(gè)值時(shí),可以使用一維數(shù)組,而且可以通過使用foreach 語句或數(shù)組的下標(biāo)將數(shù)組中的元素值讀出來。
例如:
static void Main(string[]? args)
{
int []arr={1,2,3,4,5);//定義一個(gè)一維數(shù)組,并為其賦值
foreach(int n in arr)/使用foreach 語句循環(huán)遍歷一維數(shù)組中的元素
Console.WriteLine("{0]",n+"");
Console.WriteLine();
}
當(dāng)然,也可以采用c語言的方式:
// 循環(huán)輸出數(shù)組元素
int[ ] array = new int[5] { 0, 1 ,2, 3, 4};? // 聲明并初始化一維數(shù)組
for (int i = 0; i < array.Length;i++ )? ? ? ?// 輸出數(shù)組中的所有元素
{
? ? ? ? Console.WriteLine(array[i]);
}?
3.二維數(shù)組
3.1.二維數(shù)組的創(chuàng)建
語法:
數(shù)據(jù)類型[,]? 數(shù)組名;? ? 或 數(shù)據(jù)類型[][]? 數(shù)組名;? ??
例如:
string[ ,]? ?arr1;
string[ ][ ]? arr2;?
同一維數(shù)組一樣,二維數(shù)組在聲明時(shí)也沒有分配內(nèi)存空間,同樣也要用關(guān)鍵字new來分配內(nèi)存,然后才能訪問每個(gè)變量。
對(duì)于第一種:
int[,] a=new int[2,4];?
對(duì)于第二種:
int[][] a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];?
3.2.二維數(shù)組的初始化
例如:
int[,] myarr1 = new int[,]{ { 12, 0 }, { 45, 10 } };?
int[,] myarr2 = {{12,0},{45,10}};?
3.3.二維數(shù)組的使用
? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? int[,] arr = new int[2, 2] { { 1, 2 }, { 3, 4 } };
? ? ? ? ? ? Console.Write("數(shù)組的行數(shù)為: ");
? ? ? ? ? ? Console.Write(arr.Rank);
? ? ? ? ? ? Console.Write("\n");
? ? ? ? ? ? Console.Write("數(shù)組的列數(shù)為:");
? ? ? ? ? ? Console.Write(arr.GetUpperBound(arr.Rank - 1) + 1);
? ? ? ? ? ? Console.Write("\n");
? ? ? ? ? ? for (int i = 0; i < arr.Rank; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string str = "";
? ? ? ? ? ? ? ? for (int j = 0; j < arr.GetUpperBound(arr.Rank - 1)+1; j++)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? str = str + Convert.ToString(arr[i, j]) + "";
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? Console.Write(str);
? ? ? ? ? ? Console.Write("\n");
? ? ? ? ? ? }
4.數(shù)組的基本操作
C#中的數(shù)組是由System.Array類派生而來的引用對(duì)象,因此可以使用Array類中的各種方法對(duì)數(shù)組進(jìn)行各種操作。
對(duì)數(shù)組的操作可以分為靜態(tài)操作和動(dòng)態(tài)操作。
靜態(tài)操作主要包括查找、遍歷和排序等。
動(dòng)態(tài)操作主要包括插入、刪除、合并和拆分等。本節(jié)將對(duì)數(shù)組的各種操作進(jìn)行詳細(xì)講解。
4.1數(shù)組的遍歷? ?
使用foreach語句可以實(shí)現(xiàn)數(shù)組的遍歷功能,開發(fā)人員可以用foreach語句訪問數(shù)組中的每個(gè)元素,而不需要確切地知道每個(gè)元素的索引號(hào)。
比如:
遍歷一維數(shù)組?
int[ ] array = new int[5] { 0, 1 ,2, 3, 4};? // 聲明并初始化一維數(shù)組
foreach (int i in array )? ? ? ?// 輸出一維數(shù)組中的所有元素
{
? ? ? ? Console.WriteLine(array[i]);
}?
再比如:
遍歷二維數(shù)組?
代碼1:
? int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 3, 4, 5 } };//定義二維數(shù)組
? ? ? ? ? ? for (int i = 0; i < 2; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? for (int j = 0; j < 3; j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.Write(Convert.ToString(arr[i, j]) + " ");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? Console.Write("\n");
? ? ? ? ? ? }
代碼2:
? int count = 0;
? ? ? ? ? ? int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 3, 4, 5 } };//定義二維數(shù)組
? ? ? ? ? ? foreach (int i in arr)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(count!=0&&count%3==0)
? ? ? ? ? ? ? ? ? ? Console.Write("\n");
? ? ? ? ? ? ? ? Console.Write(i+" ");
? ? ? ? ? ? ? ? count++;
? ? ? ? ? ? }
4.2對(duì)數(shù)組進(jìn)行排序【兩種排序】??
C#中提供了用于對(duì)數(shù)組進(jìn)行排序的方法Array.Sort()和Array.Reverse(),
其中,Array.Sort()方法用于對(duì)一維Array數(shù)組中的元素進(jìn)行排序,
Array.Reverse()方法用于反轉(zhuǎn)一維Array數(shù)組或者部分Array數(shù)組中的元素順序。
?Array.Sort()方法:
? ? int[] arr1 = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
? ? ? ? ? ? Array.Sort(arr1);
? ? ? ? ? ? foreach(int i in arr1)
? ? ? ? ? ? ? ? ? Console.Write(i+" ");
? ? ? ? ? ? Console.WriteLine();
Array.Reverse()方法:
? ? ? ? ? ? int[] arr2 = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
? ? ? ? ? ? Array.Reverse(arr2);
? ? ? ? ? ? foreach (int o in arr2)
? ? ? ? ? ? ? ? ? Console.Write(o + " ");
? ? ? ? ? ? Console.WriteLine();
原數(shù)組: 3? 9? 27? 6? 18 12 21 15
Sort:3 6 9 12 15 18 21 27
Reverse:15 21 12 18 6 27 9 3
5、數(shù)組排序算法【其實(shí)之前說過的Sort和Reverse方法就可以實(shí)現(xiàn)排序,這些方法就沒必要再學(xué)。這是數(shù)據(jù)結(jié)構(gòu)的部分。學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候小白再帶大家學(xué)?!?/span>
(1).冒泡排序法? ?
(2).直接插入排序法? ?
(3).選擇排序法??
6、ArrayList集合
ArrayList類相當(dāng)與一種高級(jí)的動(dòng)態(tài)數(shù)組,它是Array類的升級(jí)版。
ArrayList位于System.Collections命名空間下,它可以動(dòng)態(tài)地添加和刪除元素??梢詫rrayList類看成擴(kuò)充功能的數(shù)組,但它并不等于數(shù)組。
與數(shù)組相比:
①.數(shù)組的容量是固定的,而ArrayList的容量可以根據(jù)需要自動(dòng)擴(kuò)充。
②.ArrayList 提供添加、刪除和插入某一范圍元素的方法,但在數(shù)組中,只能一次獲取或設(shè)置一個(gè)元素的值。
③.ArrayList提供將只讀和固定大小包裝返回到集合的方法,而數(shù)組不提供。
④.ArrayList只能是一維形式,而數(shù)組可以是多維的。? ? ? ? ? ? ? ? ??
6.1.ArrayList的構(gòu)造器有三種
第一種:? ? ArrayList list = new ArrayList();
第二種: (把數(shù)組的元素給ArrayList)
? int[] arr = new int[5] { 1, 2, 3, 4, 5 };
?ArrayList list = new ArrayList(arr);
第三種: 用指定的大小初始化內(nèi)部的數(shù)組。
ArrayList List=new ArrayList(10);
比如:
ArrayList List=new ArrayList(10);
for(int i=0;i< List.Count;i++)//給ArayList對(duì)象添加10個(gè)int元素
? ? ?List.Add(i);
ArrayList的常用屬性及說明如表所示:

6.2.ArrayList元素的添加【兩種添加】
(1).Add方法
該方法用來將對(duì)象添加到ArrayList集合的結(jié)尾處,其語法格式如下:
public virtual int Add(Object value)
①.value:要添加到ArrayList的末尾處的Object,該值可以為空引用。
②.返回值:ArrayList索引,已在此處添加了value。
比如:
代碼如下:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr); //使用聲明的一維數(shù)組實(shí)例化一個(gè)ArrayList對(duì)象
List.Add(7);
(2).Insert方法
該方法用來將元素插入ArrayList集合的指定索引處,其語法格式如下:
public vitual void Insert(int index,Object value)
①.index:從零開始的索引,應(yīng)在該位置插入value。
②.value:要插入的Object,該值可以為空引用。
比如:
int[] arr=new intl{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. Insert(3,7);
6.3.ArrayList元素的刪除【四種刪除】
(1).Clear方法——全部刪除
語法:
public virtual void Clear ()
例如:
int[] arr=new int[] {1,2,3,4,5,6};?
ArrayList List=new ArrayList(arr);
List. Clear();
(2).Remove方法——?jiǎng)h除指定元素
語法:
public virtual void Remove (Object obj)
例如:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. Remove(3);
(3).RemoveAt方法——?jiǎng)h除指定索引處元素
語法:
public virtual void RemoveAt (int index)
例如:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);?
List. RemoveAt(3);
(4).RemoveRange方法——?jiǎng)h除部分元素
語法:
public virtual void RemoveRange (int index,int count)
例如:
int []arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);?
List. RemoveRange(3,2);
6.4.ArrayList歷遍
ArrayList集合的遍歷與數(shù)組類似,都可以使用foreach 語句
6.5.ArrayList元素的查找【三種查找】
(1).Contains方法【判斷是否包含這個(gè)元素】
語法:
public virtual bool Contains (Object item)
例如:
int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
ArrayList List = new ArrayList(arr);
Console.Write(List.Contains(2));
(2).IndexOf方法
查找元素,并返回與該元素匹配的第一個(gè)索引
(3).LastIndexOf方法
查找元素,并返回與該元素匹配的最后一個(gè)索引
例如:
int[] arr = new int[] { 1, 2, 3, 2,4,2, 5, 6 };
ArrayList List = new ArrayList(arr);
Console.Write(List.IndexOf(2));
Console.Write(List.LastIndexOf(2));
7、Hashtable類(System.Collections)【鍵值對(duì)】
7.1Hashtable構(gòu)造器
public Hashtable ()
public Hashtable (int capacity)
屬性圖:

7.2.Hashtable元素的添加【鍵值對(duì)】【一個(gè)添加】
Add——向Hashtable中添加元素
語法:
public virtual void Add (Object key,Object value)
key是要添加的鍵
value要添加的值
例如:
Hashtable hashtable = new Hashtable();?
hashtable.Add("id", "BH0001");?
hashtable.Add("name", "TM");
7.3.Hashtable元素的刪除【兩個(gè)刪除】
(1).Clear方法——?jiǎng)h除所有元素
語法:
?public virtual void Clear ()
(2).Remove方法——?jiǎng)h除指定鍵的元素
語法:
?public virtual void Remove (Object key)
7.4.Hashtable的遍歷
Hashtable的遍歷與數(shù)組類似,都可以使用foreach 語句。這里需要注意的是,由于Hashtable中的元素是一個(gè)鍵/值對(duì),
因此需要使用DictionaryEntry類型來進(jìn)行遍歷。DictionaryEntry類型表示一個(gè)鍵/
值對(duì)的集合。
例如:
Hashtable hashtable = new Hashtable(); //創(chuàng)建Hashtable對(duì)象
hashtable.Add("id", "BH0001"); //向Hashtable中添加元素
hashtable.Add("name", "TM");
hashtable.Add("sex", "男");
Console.WriteLine("\t 鍵\t 值");
foreach (DictionaryEntry dicEntry in hashtable)
{
? ? ?Console.WriteLine("\t " + dicEntry.Key + "\t " + dicEntry.Value);
}?
7.5.Hashtable元素的查找【三種查找】
在Hashtable中查找元素時(shí),可以使用Hashtable類提供的Contains方法、ContainsKey方法和ContainsValue方法。
下面對(duì)這3個(gè)方法進(jìn)行詳細(xì)介紹。
(1and2).Contains、ContainsKey方法——按鍵查找【它們功能一樣,語法一樣】
語法:
public virtual bool Contains (Object key)
public virtual bool ContainsKey (Object key)
例如:
Hashtable hashtable =new Hashtable();//實(shí)例化Hashtable對(duì)象
hashtable.Add("id","BH0001");//向Hashtable中添加元素
hashtable.Add("name","TM");
hashtable.Add("sex","男");
Console.WriteLine(hashtable.Contains("id"));//判斷Hashtable中是否包含指定的鍵
運(yùn)行結(jié)果為true。
(3).ContainsValue方法——按值查找
語法:
public virtual bool ContainsValue (Object value)
例如:
Hashtable hashtable=new Hashtable();//實(shí)例化Hashtable對(duì)象
hashtable.Add("id","BH0001");//向Hashtable中添加元素
hashtable.Add("name","TM");hashtable.Add("sex","男"”);
Console.WriteLine(hashtable.ContainsValue("id"));//判斷Hashtable中是否包含指定的鍵值
運(yùn)行結(jié)果為false。
【回顧一下】:
(1).對(duì)數(shù)組進(jìn)行排序【兩種排序】?
(2).ArrayList元素的添加【兩種添加】
(3).ArrayList元素的刪除【四種刪除】
(4).ArrayList元素的查找【三種查找】
(5).Hashtable元素的添加【一種添加】
(6).Hashtable元素的刪除【兩個(gè)刪除】【key】
(7).Hashtable元素的查找【三種查找】
第七章完!